从`__defineGetter__`访问原始属性值

时间:2012-10-29 23:19:17

标签: javascript oop

是否可以从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,我想赶上)

3 个答案:

答案 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