询问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+等范围内的浏览器
(这些在我的机器上的所有浏览器中都通过,除了IE 7& 8
直接使用defineProperty,没有垫片:
http://jsfiddle.net/uSYFE/
使用ES5垫片小提琴,我假设我需要做的就是包含它?:
http://jsfiddle.net/hyperthalamus/ntwDy/
使用IE推荐的解决方案:http://jsfiddle.net/hyperthalamus/xfvz3/
答案 0 :(得分:18)
根据ES5-shim:
/!\ Object.defineProperty
此方法将无法设置“可写”,“可枚举”和“可配置”属性。
在描述符上提供带“get”或“set”的getter或setter将在缺少“defineGetter”和“defineSetter”的引擎上无声地失败,其中包括到目前为止版本8的所有IE版本。
IE 8提供了此方法的一个版本,但它仅适用于DOM对象。因此,将不会安装填充程序,并且尝试设置“值”属性将在非DOM对象上静默失败。
所以你知道你的答案。它可以在DOM元素上完成,就是它(仅在IE8上)。
如果你想让IE7工作,我建议你只使用get / set方法。
答案 1 :(得分:2)
对于较旧的IE,您必须确保您的属性是dom对象(甚至是伪标签)并使用onPropertyChange来获得通知。有关详情,请参阅John Dyer的帖子。
答案 2 :(得分:0)
我自己也有同样的问题。 (See here.)看起来它在IE8或更低版本中完全不可能。否则,ES5 Shim是您最好的选择。