Object.defineProperty对于所有浏览器?(Object.definePropert

2019-07-29 02:41发布

问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,垫片没有运气,但我想确认。 我还发现一个参考这篇文章和我的测试仍然无法在IE 7和8,任何人都可以揭示出这个任意光?

我记得通过一个相关的问题看,几个月前在S / O的地方,我想我看到有人写在回答中了一个解决方案。 吸气用任何一般的解决方法/ 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/

Answer 1:

据ES5,垫片 :

/!\ Object.defineProperty

此方法将失败默默设置“可写”,“枚举”和“配置”的属性。

提供了一个getter和setter方法以“get”或描述符“设置为”已引擎缺乏“defineGetter”和“defineSetter”,其中包括多达8个版本至今IE所有版本的静默失败。

IE 8提供了一个版本的方法,但是它只能在DOM对象。 因此,垫片将不会安装和尝试设置“值”属性将失败默默非DOM对象。

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

所以,你知道你的答案。 它可以在DOM元素来完成,这是它(和仅IE8)。

我建议你只需要使用get / set方法,如果你想IE7工作。



Answer 2:

对于老的IE你必须确保你的属性是一个DOM对象(即使是假的标签),并使用onPropertyChange得到通知。 看到这个帖子由约翰·戴尔的更多细节。



Answer 3:

我有同样的问题我自己。 (见这里)。它看起来并不像它完全有可能在IE8或更低。 否则, ES5垫片是你最好的选择。



文章来源: Object.defineProperty for all browsers?