所有浏览器都支持Object.defineProperty吗?

21

以下是关于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,无需shims::
http://jsfiddle.net/uSYFE/

使用ES5 shim的fiddle,我假设我只需要包含它即可? :
http://jsfiddle.net/hyperthalamus/ntwDy/

使用IE推荐解决方案的fiddle :
http://jsfiddle.net/hyperthalamus/xfvz3/


1
现在我的Qunit测试在我的环境中。我已经导入了支架,但IE7/8仍然失败,而其他浏览器则通过了。我仅在使用“Object.defineProperty”时遇到了错误。我会看看能否创建一个隔离测试。(我应该提前做好这个) - Shane
我已经编辑了我的问题并提供了具体细节。 - Shane
1
如果 jsfiddle 能在 IE8 中工作就好了 :-( - Dai Bok
3个回答

18
根据ES5-shim
/!\ Object.defineProperty 这个方法将无声地失败,无法设置“可写”,“可枚举”和“可配置”属性。 在描述符上提供具有“get”或“set”的getter或setter会在缺少“defineGetter”和“defineSetter”的引擎上无声地失败,这包括到目前为止所有版本的IE 8。 IE 8提供了此方法的一个版本,但它仅适用于DOM对象。因此,该垫片将不会安装,并且在非DOM对象上静默地尝试设置“value”属性将失败。 https://github.com/kriskowal/es5-shim/issues#issue/5 所以你知道了答案。只能在DOM元素上完成(仅限IE8)。
如果您想要IE7正常工作,我建议您仅使用get / set方法。

2

对于旧版本的 IE,你需要确保属性是一个 DOM 对象(即使是伪标记),并使用 onPropertyChange 进行通知。请参阅John Dyer的这篇文章获取更多细节。


0

我自己也曾经有过同样的问题。(在这里看看吧。) 看起来在IE8或更低版本中完全不可能。否则,ES5 Shim 是你最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接