Firefox扩展中的__defineGetter__未定义

时间:2014-06-20 15:39:25

标签: javascript firefox firefox-addon xpcom

我正在尝试在Firefox扩展中的XUL iframe上定义一个Getter:

// iframe is an XUL iframe element
iframe.contentDocument.defaultView.HTMLElement.prototype.__defineGetter__("node", function () {
    return this.nodeName;
});

我可以访问iframe.contentDocument.defaultView.HTMLElement.prototype,但__defineGetter__未定义。

Object.defineProperty有效,但这需要为每个创建的元素定义它。

有没有办法使用HTMLElement.prototype.__defineGetter__?为什么__defineGetter__未定义?

2 个答案:

答案 0 :(得分:1)

  

Object.defineProperty有效,但这需要为每个创建的元素定义它。

不,你刚刚在原型对象上定义了属性:

Object.defineProperty(
  iframe.contentDocument.defaultView.HTMLElement.prototype,
  node,
  ...
);
  

为什么__defineGetter__未定义?

正如您在MDN documenation中所读到的,__definedGetter__不是ECMAScript的标准功能。此外,HTMLElement主机对象,并且不必遵守规范。


这是一篇较旧的文章,但可能仍然值得一读:What's wrong with extending the DOM

答案 1 :(得分:1)

使用所有可能导致创建和访问的包装器和expando(chrome上下文和内容上下文之间的隔离/安全边界包装,DOM元素包装器,可能是其他东西),这可能只是一个真正的错误。 此外,__defineGetter__是非标准的,无论如何都应该避免。

您可以使用Object.defineProperty,当我进行粗略测试时,它似乎有效。

Object.defineProperty(iframe.contentWindow.HTMLElement.prototype, "node", {
  "get": function() {
    return this.nodeName;
  }
});

说到这一点,强烈不鼓励扩展内置对象的原型,因为当你不是自己的代码扩展时(出于兼容性原因),甚至可能导致AMO拒绝你的完整评论