Object.defineProperty 对于所有的浏览器都适用吗?

8 浏览
0 Comments

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:

http://jsfiddle.net/uSYFE/

使用 ES5 shim 的fiddle,我假设我只需要包括它就可以了? :

http://jsfiddle.net/hyperthalamus/ntwDy/

使用IE推荐的解决方案的 fiddle :

http://jsfiddle.net/hyperthalamus/xfvz3/

admin 更改状态以发布 2023年5月23日
0
0 Comments

对于旧版IE浏览器,你必须确保你的属性是一个dom对象(即使是一个伪标签),并使用onPropertyChange进行通知。查看John Dyer的这篇文章了解更多详情。

0
0 Comments

根据ES5-shim的说法:

/!\ Object.defineProperty

此方法在设置“writable”、“enumerable”和“configurable”属性时会悄悄失败。

在描述符上提供具有“get”或“set”的getter或setter将在缺少“defineGetter”和“defineSetter”的引擎上悄悄失败,其中包括到目前为止所有版本的IE。

IE 8提供了此方法的一个版本,但它仅适用于DOM对象。因此,shim将无法安装,并且在非DOM对象上悄悄失败地尝试设置“value”属性。

https://github.com/kriskowal/es5-shim/issues#issue/5

因此,您已经知道了答案。它只能在DOM元素上完成(仅适用于IE8)。
如果您想使IE7工作,建议您只使用get/set方法。

0