如何覆盖HTMLElement原型上的getter函数

时间:2014-04-10 07:54:28

标签: javascript compatibility

由于Object.__defineGetter__()已被弃用,我尝试使用Object.defineProperty()覆盖HTMLSpanElement.prototype.offsetWidth上的getter函数,以便所有<span>元素在offsetWidth时返回相同的值财产被访问。

这在Firefox 28和IE 11中完全正常,但在Chrome 33和34中(也许是其他版本,我只尝试过这两个版本)defineProperty()似乎无法覆盖对象原型的getter

这是我的代码,HTML:

<span id="testspan">The quick brown fox</span>

使用Javascript:

Object.defineProperty(HTMLSpanElement.prototype, "offsetWidth", {
    get: function(){return 5;},
    });

var x = document.getElementById("testspan");
window.alert( x.offsetWidth );

因此,每当访问span对象的offsetWidth时,它应该返回5.在Firefox 28和IE11中,它工作正常。但是在Chrome 33和34中,它返回span元素的实际宽度,在本例中为126.根据ECMA-262 v5规范(相关章节here),假设我正确解释它,我应该能够为原型重新定义getter和setter。我错过了什么吗?任何人都有Chrome 34的解决方法/黑客攻击?

在JSFiddle here上试试。如果已安装,请在Chrome和Firefox中试用。

类似的问题被问到here,尽管Scimonster的建议在Chrome 34中不起作用。

1 个答案:

答案 0 :(得分:0)

修改属性

当属性已存在时,Object.defineProperty()会尝试根据描述符中的值和对象的当前配置来修改属性。如果旧描述符的可配置属性设置为false(该属性被称为“不可配置”),则可以更改除可写之外的任何属性。在这种情况下,也无法在数据和访问者属性类型之间来回切换。

如下所述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

并且是从实例中删除offsetWidth将强制进行原型检查并返回5:)