我正在尝试在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__
未定义?
答案 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拒绝你的完整评论