是否可以从Javascript getter访问原始属性值?
如果没有,是否有其他“现代”javascript技术可以实现类似的东西?
也就是说,如果我有这样的代码
o = {}
o.foo = "bar"
o.__defineGetter__("foo", function(){
//can I access the value "bar" here?
return "some other value";
});
是否可以从我的getter函数中访问值“bar”?或者使用__defineGetter__
吹走财产?
(上下文:不是新手开发者,但我过去4/5年一直忽略非跨浏览器的Javascript,我想赶上)
答案 0 :(得分:1)
ECMAscript 262第5版介绍了在规范正式定义的对象上使用 getters 和 setters 的选项。您可以直接在对象文字
上设置它们var foo = {
get bar() {
return "foo";
}
};
或使用Object.defineProperty()
var foo = { };
Object.defineProperty(foo, 'bar', {
get: function() {
return "foo";
}
});
然而,问题仍然存在。覆盖一个属性将不可重复覆盖它。您可以做的是使用对象prototype chain
来激发属性。
var foo = { };
foo.bar = 42;
Object.defineProperty(Object.getPrototypeOf( foo ), 'bar', {
get: function() {
return 'overwritten';
},
configurable: true
});
console.log( foo.bar ); // 42
delete foo.bar;
console.log( foo.bar ); // "overwritten"
答案 1 :(得分:1)
不,__defineGetter__
(以及Object.defineProperty
)会覆盖旧的一切。在“吹走财产”之前,你必须将旧值缓存在一个额外的变量中。
使用IEFE作为闭包:
o = {foo: "bar"};
(function(oldval) {
o.__defineGetter__("foo", function(){
return "new"+oldval;
});
})(o.foo);
o.foo; // "newbar"
答案 2 :(得分:1)
__ defineFetter__就像
的快捷方式Object.defineProperty(o, "foo", {get : function() {
return "some other value";
},
enumerable : true});
所以 o.foo 值只是被覆盖了。要解决此问题,请添加其他属性 o._foo ,不要忘记setter。
我的例子:
var o = {};
Object.defineProperty(o, "foo", {
get : function() {
return this._foo;
},
set : function(value) {
this._foo = value;
},
enumerable : true});
o.foo = "newbar";
o.foo; //newbar