由于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中不起作用。
答案 0 :(得分:0)
修改属性
当属性已存在时,Object.defineProperty()会尝试根据描述符中的值和对象的当前配置来修改属性。如果旧描述符的可配置属性设置为false(该属性被称为“不可配置”),则可以更改除可写之外的任何属性。在这种情况下,也无法在数据和访问者属性类型之间来回切换。
并且是从实例中删除offsetWidth将强制进行原型检查并返回5:)