所有浏览器的 Object.defineProperty?
Posted
技术标签:
【中文标题】所有浏览器的 Object.defineProperty?【英文标题】:Object.defineProperty for all browsers? 【发布时间】:2012-05-04 03:43:10 【问题描述】:询问 Object.defineProperty 如下所示:
function testComponent()
var testProperty;
Object.defineProperty(this, "testProperty",
get : function()
return testProperty;
,
set : function(val)
testProperty = val;
);
这样使用的地方:
testObject = new testComponent();
testObject.testProperty = "testValue";
根据我目前所见,似乎没有跨浏览器解决方案,因为我尝试使用 es5-shim 没有运气,但我想确认一下。我还找到了对 this post 的引用,而我的测试在 IE 7 和 8 中仍然失败,有人能对此有所了解吗?
我记得几个月前在 S/O 的某个地方查看了一个相关问题,我想我看到有人在答案中为此写了一个解决方案。 getter / setter 的任何一般解决方法也将不胜感激。这个想法是我需要一个对象上的 getter setter 等价物,而不通过方法传递参数更改。我不需要IE6,但我想支持IE7+ ff 3.6+等范围内的浏览器
QUnit 测试如下:(jsFiddles)
(这些在我机器上的所有浏览器中传递,除了 IE 7 和 8
直接使用defineProperty,无垫片:http://jsfiddle.net/uSYFE/
使用 ES5 垫片,我假设我需要做的就是包含它? :http://jsfiddle.net/hyperthalamus/ntwDy/
使用 IE 推荐的解决方案摆弄 :http://jsfiddle.net/hyperthalamus/xfvz3/
【问题讨论】:
现在我的 Qunit 测试在我的环境中。我已经导入了垫片并且 IE7 / 8 仍然失败,而我的其他浏览器正在通过。我只是在使用“Object.defineProperty”时遇到错误。我会看看我是否可以创建一个隔离测试。 (我应该提前做的) 用细节编辑了我的问题 如果只有 jsfiddle 在 IE8 中工作 :-( 【参考方案1】:根据ES5-shim:
/!\ Object.defineProperty
此方法将默认设置“可写”、“可枚举”和“可配置”属性失败。
在缺少“defineGetter”和“defineSetter”的引擎(包括目前为止的所有 IE 版本 8 版本)上,在描述符上提供带有“get”或“set”的 getter 或 setter 会静默失败。
IE 8 提供了此方法的一个版本,但它仅适用于 DOM 对象。因此,不会安装 shim,并且尝试设置“值”属性将在非 DOM 对象上静默失败。
https://github.com/kriskowal/es5-shim/issues#issue/5
所以你知道你的答案。它可以在 DOM 元素上完成,仅此而已(仅在 IE8 上)。
如果你想让 IE7 工作,我建议你只使用 get/set 方法。
【讨论】:
【参考方案2】:对于较旧的 IE,您必须确保您的属性是 dom 对象(甚至是假标签)并使用 onPropertyChange 来获得通知。有关详细信息,请参阅John Dyer 的这篇文章。
【讨论】:
【参考方案3】:我自己也有同样的问题。 (See here.) 看起来在 IE8 或更低版本中完全有可能。否则ES5 Shim 是您最好的选择。
【讨论】:
以上是关于所有浏览器的 Object.defineProperty?的主要内容,如果未能解决你的问题,请参考以下文章
重置/删除所有浏览器(包括移动设备)上的输入、选择和按钮的所有样式