所有浏览器的 Object.defineProperty?

Posted

技术标签:

【中文标题】所有浏览器的 Object.defineProperty?【英文标题】:Object.defineProperty for all browsers? 【发布时间】:2012-05-04 03:43:10 【问题描述】:

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

【问题讨论】:

现在我的 Qunit 测试在我的环境中。我已经导入了垫片并且 IE7 / 8 仍然失败,而我的其他浏览器正在通过。我只是在使用“Object.defineProperty”时遇到错误。我会看看我是否可以创建一个隔离测试。 (我应该提前做的) 用细节编辑了我的问题 如果只有 jsfiddle 在 IE8 中工作 :-( 【参考方案1】:

根据ES5-shim:

/!\ Object.defineProperty

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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于所有浏览器的 Object.defineProperty?的主要内容,如果未能解决你的问题,请参考以下文章

重置/删除所有浏览器(包括移动设备)上的输入、选择和按钮的所有样式

关于从 Rails 2 中所有浏览器中的所有活动会话自动注销的问题

所有浏览器的通知

我需要从浏览器中获取所有 cookie

所有浏览器都支持 querySelector 吗?

所有最新浏览器中电子邮件的最佳表单字段验证模式