所有浏览器的Object.defineProperty?

时间:2012-04-23 14:02:55

标签: javascript getter-setter 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 但没有运气,但我想确认。我还找到了对 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/

3 个答案:

答案 0 :(得分:18)

根据ES5-shim

  

/!\ Object.defineProperty

     

此方法将无法设置“可写”,“可枚举”和“可配置”属性。

     

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

     

IE 8提供了此方法的一个版本,但它仅适用于DOM对象。因此,将不会安装填充程序,并且尝试设置“值”属性将在非DOM对象上静默失败。

     

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

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

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

答案 1 :(得分:2)

对于较旧的IE,您必须确保您的属性是dom对象(甚至是伪标签)并使用onPropertyChange来获得通知。有关详情,请参阅John Dyer的帖子。

答案 2 :(得分:0)

我自己也有同样的问题。 (See here.)看起来它在IE8或更低版本中完全不可能。否则,ES5 Shim是您最好的选择。