4

Javascript ゲッターから元のプロパティ値にアクセスすることは可能ですか?

そうでない場合、同様のことを達成するための他の「最新の」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

いいえ、__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

ECMAscript 262 エディション 5 では、仕様によって公式に定義されたオブジェクトにゲッターセッターを設定するオプションが導入されました。オブジェクトリテラルで直接設定できます

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(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 に答える