1

私のクラスには次のようなオブジェクトがあります。

this.options = {
     a: 1,
     b: 2,
     ...
};

オプションオブジェクトをJavascriptの現在のスコープに「アタッチ」して、(との代わりaに)b直接参照できるようにする方法があるかどうか疑問に思いました。何かのようなもの:this.options.athis.options.b

attach(this.options);
var myVariable = a + 3; // 4
detach(this.options);

また

with( this.options, {
   // code here
 var myVariable = a + 3; // 4
});

上記では、attachwithは、のすべての子を取得this.optionsして現在のスコープにアタッチする効果があるため、のa代わりにを介してアクセスできますthis.options.a。(withバージョンは、完了すると単に切り離さthis.optionsれ、そのスコープ内に損傷を与える可能性のあるアタッチメントを囲みます)。

Spidermonkey / Mozillaエンジンで動作する限り、ポータブルでなくてもかまいません。

好奇心と怠惰のためにこれに言及するだけです:ネストされた名前はすべて入力するのが面倒になり、R言語ではこれが可能であることを知っています(実際、上記のスニペットの構文はほぼ正確にあなたが書くものですこれを達成するためにRで)。

4

2 に答える 2

1

JavaScriptには、あなたが説明するものと同様に機能するwithステートメントがあります。

with (this.options) {
    var myVariable = a + 3;  // here a is actually this.options.a
}

ただし、リンクしたMDNの記事でわかるように、たとえば、あいまいさの可能性があるため、これを使用することにはいくつかの短所があります。上記の例でaは、のプロパティでthis.optionsあるか、他の場所で定義された変数である可能性があり、そのブロックだけを見るとわかりません。

with推奨されません(厳密モードでは禁止されています)。

ただし、安全な代替手段があります。(この例でも)参照する変数を作成しますthis.options

var o = this.options;

var myVariable = o.a + 3;

単独で入力するほど短くはありませんが、どこでもa繰り返すよりも短くなります。this.options

于 2012-05-15T06:07:18.063 に答える
0

オブジェクトを別のオブジェクトでラップしattachdetachメソッドと、実際のデータオブジェクトを格納するための内部キャッシュを使用できます。次に、コールバック内のようにメソッドattachdetachメソッドを提供dataします。this

function TheObject(data){
    var that = this;

    this.data = data;

    this.attach = function(callback){
        callback.apply(that.data);
    }

}

//wrap the object
var myobj = new TheObject({
    a: 1,
    b: 2
});


myobj.attach(function(){
    //"this" in here is the "data" in the object.
    //this.a
    //this.b
});
于 2012-05-15T06:01:30.420 に答える