20

询问 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 / 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/

4

3 回答 3

18

根据ES5-shim

/!\ Object.defineProperty

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

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

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

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

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

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

于 2012-04-23T17:20:08.113 回答
2

对于较旧的 IE,您必须确保您的属性是 dom 对象(甚至是假标签)并使用 onPropertyChange 来获得通知。有关更多详细信息,请参阅John Dyer的这篇文章。

于 2012-06-06T15:44:23.717 回答
0

我自己也有同样的问题。(请参阅此处。)在 IE8 或更低版本中,它看起来并不完全可行。否则ES5 Shim是您最好的选择。

于 2012-04-23T17:17:23.103 回答