好奇心に駆られた質問です。次のコードがある場合、メソッドではthis
なく経由でプロパティを呼び出すことの利点は何ですか?user
show_name
var user = {
name : 'John Doe',
show_name : function(){
alert(this.name);
// OR
alert(user.name);
}
};
好奇心に駆られた質問です。次のコードがある場合、メソッドではthis
なく経由でプロパティを呼び出すことの利点は何ですか?user
show_name
var user = {
name : 'John Doe',
show_name : function(){
alert(this.name);
// OR
alert(user.name);
}
};
この例を見れば、違いは明らかです。2 番目のオブジェクトを作成し、それに応じてプロトタイプを設定します。
var user = {
name : 'John Doe',
show_name : function(){
alert(this.name);
// OR
alert(user.name);
}
};
user2 = Object.create( user );
user2.name = "someone else";
user2.show_name();
Herethis.name
は現在のオブジェクトのname
プロパティをuser.name
参照しますが、常に元のname
プロパティを参照します。
を使用this
することで、変数名を変更した後user
もsomething
コードが引き続き機能することを確認できます。
それ以外に、(一部のブラウザーでは) パフォーマンスが向上する可能性があると思います。ブラウザーでは、現在のコンテキストにスティックをuser.name
使用しているときに、関数の外部のコンテキストでルックアップする必要があるためです。this.name
サンプルコード
var user = {
name : 'John Doe',
show_name : function(){
alert(user.name);
}
};
var something = user; // Passing the object to another variable
user = null; // Make the user variable point to something else
something.show_name();
上記のコードを実行すると、次の行でエラーが発生します。
alert(user.name); // <-- user is null, so this will produce the following Error:
キャッチされていない TypeError: null のプロパティ 'name' を読み取れません
ここで、this
の代わりに に切り替えるとuser
、コードが機能します。
var user = {
name : 'John Doe',
show_name : function(){
alert(this.name);
}
};
var something = user; // Passing the object to another variable
user = null; // Make the user variable point to something else
something.show_name();
上記のコードは、関数this
を実行したオブジェクトを指すため機能しshow_name
ます (これは . ドット メソッド表記の左側にあり、 が指すオブジェクトsomething
です)。
参考文献:
実行コンテキスト (この例ではオブジェクト) が this バインディングにどのように影響するかについて詳しく知るには、Kyle Simpsonによるすばらしい本You Don't Know JSからの抜粋を読んでください。
次の章では、 がさまざまなコンテキストでどのように動作するかを徹底的に説明しますthis
(ただし、シリーズ全体を読む価値があります!)。
同じ関数を複数の場所で使用して、コンテキストに依存させることができます。
function foo() {
alert(this.name);
}
var a = { alert: foo, name: "A" };
var b = { alert: foo, name: "B" };
a.alert();
b.alert();
this
関数名を使用するかどうかは、関数の呼び出し方法によって異なります。
関数のthis
値は、関数の呼び出し方法またはbindによって設定されるため、関数が適切なオブジェクトのメソッドとして常に呼び出される場合は、 を使用しますthis
。ただし、他の方法で呼び出される可能性がある場合、またはthis
特定のオブジェクトのみを参照する必要がある場合は、バインドまたはオブジェクト名を使用してください。
たとえば、OPの例が与えられた場合、次のことを考慮してください。
var x = user.showName;
x();
上記でshowName
は、 はその を設定せずに呼び出されるthis
ため、デフォルトでグローバル オブジェクトになりthis.name
、関数内では期待どおりにならない可能性があります。
関数名の変更は、テキスト エディターでかなり強力な検索および置換機能が利用できることを考えると、特に厄介な問題ではありません。
ところで、この質問はよく聞かれます。「正しい」答えはありません。特定の場合にどのように選択するかについてのアドバイスのみです。
オブジェクトの複数のコピーを作成している場合はthis
、現在のオブジェクトを参照できるようにする必要があります。名前を使用すると、作業中のコピーではなく、既定のオブジェクトが参照されます。
this
ここでは、オブジェクトが現在の名前空間の一部であり、オブジェクト内でアクセス可能であることを指定します.. オブジェクト名が からuser
に変更されnewUser
、依存関係がなくなり、結合の問題が解消されると仮定します..