6

javascript クラス関数を作成している間、私はthis.たくさん使用しています。varしかし、それを使用している間、代わりに使用することで違いがあったかどうか疑問に思います.

var myClass = function() {
    this.x = 4;
    return {
        getVal: this.x
    };
}

対 var を使用した同じこと

var myClass = function() {
    var x = 4;
    return {
        getVal: x
    };
}

違いは何ですか?いつ使用する必要がありますか?

4

4 に答える 4

8

を持つ変数は変数にthisなりpublic、 を持つ変数は変数にvarなりprivateます。

thisキーワードで宣言された変数または関数は、クラスのインスタンス メンバーになります。つまり、そのクラスの新しく作成された各インスタンスで使用できるようになります。を使用すると、クラスが作成され、以下に示すようにキーワードをthis使用してインスタンス化する必要があります。new

例:

function Foo() {
  // private var
  var bar = 'I am bar';
  // public var
  this.baz = 'I am baz';
}

var f = new Foo;
console.log(f.bar); // undefined
console.log(f.baz); // I am baz

JavaScriptクラス関数を作成しながら、これを使用しています。多くの。しかし、それを使用している間、代わりに var を使用することで違いがあったかどうか疑問に思います。

this大きな違いがあります。特に必要でない限り、クラスのインスタンスに表示したくないキーワードで変数を作成しないでください。これは単純にオーバーヘッドを生み出すだけであり、Crockford 氏が言うように計算の無駄です。

于 2012-06-22T18:28:20.257 に答える
1

でアクセスできますthis.xmyClass.x、ケースではアクセスできませんvar x。これはすべてカプセル化に関するものです。

于 2012-06-22T18:24:02.603 に答える
1

継承を行う必要がない場合、クロージャー (var の場合) とオブジェクト (this の場合) は基本的に同じことを行い、ほぼ交換可能です。

注意すべき相違点:

  • 「this」を使用する場合、コンストラクターは「new」で呼び出す必要があり、メソッドを変数に格納するかコールバックとして渡す場合は、メソッドを .call で呼び出す必要があります。

  • 多くのオブジェクトをインスタンス化すると、パフォーマンスの違いが生じる可能性があります (現在のエンジンはオブジェクトの方が優れている可能性がありますが、メソッドをコンストラクターで設定する代わりにプロトタイプに配置した場合のみ)

  • 「var」で宣言された変数はプライベートであり、関数の外からアクセスすることはできません。これで問題ない場合もありますが、これにより継承ができなくなる可能性があります (「Javascript で保護」という概念はありません)。

于 2012-06-22T18:28:38.140 に答える
1

this:xインスタンス変数のようなものです。これらの変数にはパブリック スコープがあります。OOP ではクラス変数として機能します。

var x;範囲が限られていますが。これらの変数はプライベート変数のように動作し、ローカル スコープ内でアクセスできます。

于 2012-06-22T18:34:58.650 に答える