Javascript __Firefox扩展中的defineGetter_u_;未定义

Javascript __Firefox扩展中的defineGetter_u_;未定义,javascript,firefox,firefox-addon,xpcom,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.HTMLElemen

我试图在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
,但是
\uuu defineGetter\uuuu
未定义

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

有没有一种方法可以使用
HTMLElement.prototype.\uu defineGetter\uuuu
?为什么
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\uuuuuuuuuu
未定义

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

不,您刚刚在prototype对象上定义了属性:

Object.defineProperty(
  iframe.contentDocument.defaultView.HTMLElement.prototype,
  node,
  ...
);
为什么
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\uuuuuuuuuu
未定义

正如您在中所读到的,
\uuuuuu definedGetter\uuuu
不是ECMAScript的标准功能。此外,
HTMLElement
是一个主机对象,不必遵守规范



这是一篇较老的文章,但可能仍然值得一读:

对于所有可能导致创建和访问的包装器和expandos(chrome上下文和内容上下文之间的隔间/安全边界包装器、DOM元素包装器,可能是其他东西),这可能只是一个真正的bug。 另外,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
是非标准的,无论如何都应该避免

您可以使用
Object.defineProperty
,当我做一个粗略的测试时,它似乎可以工作

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

话虽如此,如果您不是以这种方式扩展自己的代码(出于兼容性原因),则强烈反对扩展内置对象的原型,甚至可能导致AMO拒绝您进行全面审查。

是的,我尝试过Object.defineProperty(iframe.contentWindow.HTMLElement并在一个小提琴中工作,但在我的扩展中没有。谢谢,这确实在内容上下文中工作,但由于某种原因在我的扩展中失败。您在扩展中尝试过它吗?可能所有这些包装器中的一个只是“吃掉”了它。