2012-05-22 3 views
12

そのリテラルの一部である関数内のオブジェクトリテラルを参照するのは問題がありますか?それはうまくいくようですが、私は他の意味がないことを確認したいと思います。使用Javascript:Object 'this'の代わりに独自のキーの関数内のリテラル参照

var obj = { 
    key1: "it", 
    key2: function(){return this.key1 + " works!"} 
}; 
alert(obj.key2()); 

の代わり:ここ

は私が話しているかの例です

var obj = { 
    key1: "it", 
    key2: function(){return obj.key1 + " works!"} 
}; 
alert(obj.key2()); 

答えて

16

どちらも問題になる可能性があります。

var obj = { 
    key1: "it", 
    key2: function(){ return this.key1 + " works!" } 
}; 
var func = obj.key2; 
alert(func()); // error 

funcobjの方法として呼び出されていない場合は、thisは(ここでは:グローバルオブジェクト「window」)何か他のものを参照することができます。ここで

var obj = { 
    key1: "it", 
    key2: function(){ return obj.key1 + " works!" } 
}; 
var newref = obj; 
obj = { key1: "something else"; }; 
alert(newref.key2()); // "something else works" 

我々は、関数内のobjは今、いくつかの他のオブジェクトを指すかもしれませんが、別の参照からのオブジェクトにアクセスします。

したがって、どのケースが可能性が高いかを選択する必要があります。あなたが本当にそれを安全にしたい場合は、objがスコープされており、変更することはできません閉鎖使用することができます。

var obj = (function(){ 
    var local = { 
     key1: "it", 
     key2: function(){ return local.key1 + " works always!" } 
    }; 
    return local; 
})(); 

をしたり、オブジェクトへのbind()機能:

var obj = { 
    key1: "it", 
    key2: function(){ return this.key1 + " works always!" } 
} 
obj.key2 = obj.key2.bind(obj); 
0

を私は上からどんな意味合いがあるとは思いません私の頭の。

var obj = { 
    key1: "it", 
    key2: key1 + " works!" 
} 

エラーが発生する可能性がありますので、誤ってこの操作を行わないようにしてください。それ以外には、あなたは行かなくてはなりません!

1

可変スコープのバインディングに違いがあります。後でOBJを変更する場合は、KEY2の戻り値を変更します:

var newobj = obj; 
obj = { key1: "new" }; 
alert(newobj.key2()); 

は、今では「新しい作品を!」警告、あなたは(今newobjです)元のオブジェクトにkey2()、呼び出しているにもかかわらず、ためobj.key1への参照は、新しいobjインスタンスの値にバインドされるようになりました。 thisを使用すると、これが起こらないようにします。

デモ:http://jsfiddle.net/m6CU3/

1

あなたがプロトタイプオブジェクトを使用していない場合、あなたはそのように行くCZN。あなたのオブジェクトのすべてのインスタンスがobjインスタンスの値を返すので...

1

いずれか、またはどちらの方法も状況に応じて適用される場合があります。

関数内の値thisは、関数がどのように呼び出されたかによって異なります。あなたはこのようなオブジェクトのプロパティとしての機能を呼び出す場合:

obj.key2(); 
//or 
obj["key2"](); 

その後thisは、そのオブジェクトになります。オブジェクトがオブジェクトリテラルを介して作成されたかどうか、または他の手段で作成されたものは関係ありません。

しかし、.call()または.apply()を使用して関数を呼び出し、他のオブジェクトに明示的にthisを設定することができます。

も考えてみましょう:

var obj = { 
    key1: "it", 
    key2: function(){return this.key1 + " works!"} 
}; 
alert(obj.key2()); // alerts "it works!" 

var func = obj.key2; 
alert(func())​;  // alerts "undefined works!" 

私はobj.key2と同じ機能を参照するためにfuncを設定するが、func()はがobjthis設定していないとして、それを呼んでいます。

詳細はwhat MDN has to say about thisをご覧ください。

関連する問題