Object.defineProperty 对于所有的浏览器都适用吗?
Object.defineProperty 对于所有的浏览器都适用吗?
问关于如下所示的 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 没有成功,但我想确认一下。我还找到了一个参考 此篇文章,但在IE 7和8上我的测试仍然失败,有人能为此提供一些解决方法吗?
我记得几个月前在S/O上看到一个相关问题的答案,我认为我在答案中看到有人已经编写了解决方案。任何关于getter / setters的通用解决方法也将不胜感激。这个想法是我需要一个对象的getter/setter的等效方法,而不是通过一个方法传递参数的变化。我不需要支持IE6,但我想支持IE7 + ff3.6+等浏览器。
以下是 QUnit 测试:(jsFiddles)
(这些都通过了我机器上的所有浏览器,除了IE 7和8)
直接使用 defineProperty,没有 shims:
使用 ES5 shim 的fiddle,我假设我只需要包括它就可以了? :
http://jsfiddle.net/hyperthalamus/ntwDy/
使用IE推荐的解决方案的 fiddle :
http://jsfiddle.net/hyperthalamus/xfvz3/
根据ES5-shim的说法:
/!\ Object.defineProperty
此方法在设置“writable”、“enumerable”和“configurable”属性时会悄悄失败。
在描述符上提供具有“get”或“set”的getter或setter将在缺少“defineGetter”和“defineSetter”的引擎上悄悄失败,其中包括到目前为止所有版本的IE。
IE 8提供了此方法的一个版本,但它仅适用于DOM对象。因此,shim将无法安装,并且在非DOM对象上悄悄失败地尝试设置“value”属性。
因此,您已经知道了答案。它只能在DOM元素上完成(仅适用于IE8)。
如果您想使IE7工作,建议您只使用get/set方法。