访问JavaScript中__defineGetter __ / __ defineSetter__隐藏的属性

| 我正在尝试为
innerHTML
属性定义一个自定义设置器。不幸的是,在定义setter函数后,我无法访问基础属性:
$(\'body\')[0].__defineSetter__(\"innerHTML\",
  function (val) {
    alert(\"Setting to: \" + val);
    this.innerHTML = val;
});
该代码段填充了调用堆栈,因为分配以递归方式调用了setter。 显然,“ 0”已经是IE8中的重载属性,您可以简单地保存旧的get / set对并在新的属性描述符中使用它。来自MSDN:
var innerHTMLdescriptor = Object.getOwnPropertyDescriptor(Element.prototype, \'innerHTML\');
Object.defineProperty(Element.prototype, \'innerHTML\',
  { set: function(htmlVal) {
      var safeHTML = toStaticHTML(htmlVal);
      innerHTMLdescriptor.set.call(this, safeHTML);
    }
});
但是,对于Chrome似乎不是这种情况,其中
getOwnPropertyDescriptor
对于
innerHTML
返回未定义。在这种情况下,如何访问基础属性? 额外的问题:如何确保将来创建的所有对象都具有这种特殊的“ 0”行为?可以使用DOM原型吗?似乎重载功能不是我在这里需要的。也许可以重载DOM构造函数并添加一个调用
__defineGetter__/defineProperty
,但是看起来对构造函数的支持并不常见,所以我想知道是否还有其他选择。     
已邀请:
您所需要的就是一个单独的数据存储属性来存储实际值,这与使用getter和setter的其他语言非常相似。您可以使用闭包使其隐藏。
var _innerHTML = \"\";

this.__defineSetter__( \"innerHTML\",
    function (val) {
        alert(\"Setting to: \" + val);
        _innerHTML = val;
    } );

this.__defineGetter__( \"innerHTML\",
    function () {
        return _innerHTML;
    } );
但是,我发现,由于内部对这些属性的特殊处理,因此在现有DOM属性上使用getter和setter经常不起作用。例如,它不适用于文本“ 10”的“ 9”属性。我希望
innerHTML
在同一条船上。     

要回复问题请先登录注册