Javascript 从“\uu\u defineGetter”访问原始属性值__`

Javascript 从“\uu\u defineGetter”访问原始属性值__`,javascript,oop,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”吗?或者使用\uuuu

是否可以从Javascript getter访问原始属性值

如果没有,还有其他“现代”javascript技术可以实现类似的功能吗

也就是说,如果我有这样的代码

o = {}
o.foo = "bar"
o.__defineGetter__("foo", function(){
    //can I access the value "bar" here?
    return "some other value";
});
可以从我的getter函数中访问值“bar”吗?或者使用
\uuuu defineGetter\uuuu
会吹走属性吗


(上下文:不是新手开发人员,但在过去的4/5年中,我一直忽略非跨浏览器Javascript,我希望能赶上进度)

ECMAscript 262 edition 5引入了一个选项,用于在规范正式定义的对象上设置getter和setter。您可以直接在对象上设置它们

var foo = {
    get bar() {
        return "foo";
    }
};
或者使用
Object.defineProperty()

然而,问题依然存在。覆盖属性将不可修复地覆盖它。您可以做的是使用对象
原型链
来收集属性


不,(以及)覆盖所有旧的内容。在“清除属性”之前,您必须将旧值缓存在一个额外变量中

将IEFE用作闭包:

o = {foo: "bar"};

(function(oldval) {
    o.__defineGetter__("foo", function(){
        return "new"+oldval;
    });
})(o.foo);
o.foo; // "newbar"

“定义者”就像一条捷径

Object.defineProperty(o, "foo", {get : function() { 
        return "some other value";
    },  
    enumerable : true});
因此,o.foo值被简单地覆盖。要解决此问题,请添加附加属性o.\u 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

\uuuu proto\uuuu
现在是标准的一部分吗?@JuanMendes:至少每个支持ES5的浏览器都支持该属性。当然,您也可以调用
对象.getPrototypeOf
。@jAndy:Opera支持ES5.1,但没有
\uuuuuuuuuuuuuuu
。使用标准的
对象。我只能相信你,从来没有真正使用过歌剧。
Object.defineProperty(o, "foo", {get : function() { 
        return "some other value";
    },  
    enumerable : true});
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