4

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

4

3 回答 3

1

ECMAscript 262 第 5 版引入了在规范正式定义的对象上使用gettersetter的选项。您可以直接在对象文字上设置它们

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"
于 2012-10-29T23:34:08.840 回答
1

不,__defineGetter__(以及Object.defineProperty)覆盖所有旧的。在“吹走该属性”之前,您必须将旧值缓存在一个额外的变量中。

使用 IEFE 作为闭包:

o = {foo: "bar"};

(function(oldval) {
    o.__defineGetter__("foo", function(){
        return "new"+oldval;
    });
})(o.foo);
o.foo; // "newbar"
于 2012-10-29T23:37:37.153 回答
1

__defineGetter__ 就像一个快捷方式

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
于 2012-10-30T00:11:49.280 回答