10

好奇心に駆られた質問です。次のコードがある場合、メソッドではthisなく経由でプロパティを呼び出すことの利点は何ですか?usershow_name

var user = {

    name : 'John Doe',

    show_name : function(){

        alert(this.name);

        // OR

        alert(user.name);
    }
};
4

7 に答える 7

14

この例を見れば、違いは明らかです。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プロパティを参照します。

于 2012-10-09T12:13:09.050 に答える
9

を使用thisすることで、変数名を変更した後usersomethingコードが引き続き機能することを確認できます。

それ以外に、(一部のブラウザーでは) パフォーマンスが向上する可能性があると思います。ブラウザーでは、現在のコンテキストにスティックを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(ただし、シリーズ全体を読む価値があります!)。

第1章:あれこれ?

第 2 章: これですべてが理解できるようになりました!

于 2012-10-09T12:10:27.953 に答える
4

同じ関数を複数の場所で使用して、コンテキストに依存させることができます。

function foo() {
  alert(this.name);
}

var a = { alert: foo, name: "A" };
var b = { alert: foo, name: "B" };
a.alert();
b.alert();
于 2012-10-09T12:11:13.850 に答える
2

this関数名を使用するかどうかは、関数の呼び出し方法によって異なります。

関数のthis値は、関数の呼び出し方法またはbindによって設定されるため、関数が適切なオブジェクトのメソッドとして常に呼び出される場合は、 を使用しますthis。ただし、他の方法で呼び出される可能性がある場合、またはthis特定のオブジェクトのみを参照する必要がある場合は、バインドまたはオブジェクト名を使用してください。

たとえば、OPの例が与えられた場合、次のことを考慮してください。

var x = user.showName;
x();

上記でshowNameは、 はその を設定せずに呼び出されるthisため、デフォルトでグローバル オブジェクトになりthis.name、関数内では期待どおりにならない可能性があります。

関数名の変更は、テキスト エディターでかなり強力な検索および置換機能が利用できることを考えると、特に厄介な問題ではありません。

ところで、この質問はよく聞かれます。「正しい」答えはありません。特定の場合にどのように選択するかについてのアドバイスのみです。

于 2012-10-09T13:23:48.760 に答える
0

オブジェクトの複数のコピーを作成している場合はthis、現在のオブジェクトを参照できるようにする必要があります。名前を使用すると、作業中のコピーではなく、既定のオブジェクトが参照されます。

于 2012-10-09T12:12:07.637 に答える
0

thisここでは、オブジェクトが現在の名前空間の一部であり、オブジェクト内でアクセス可能であることを指定します.. オブジェクト名が からuserに変更されnewUser、依存関係がなくなり、結合の問題が解消されると仮定します..

于 2012-10-09T12:13:22.860 に答える