2012-06-22 7 views
5

javascriptクラスの機能を作っているうちに、私はthis.をたくさん使っています。しかし、それを使用している間、それは代わりにvarを使用することに違いが生じたかどうか疑問に思う。 いつthis.x.xs var xを使うべきですか?

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

VAR

の使用と同じこと対

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

いただきまし違いと私はそれらを使用する必要があるとき?

答えて

7

thisの変数はpublicの変数になり、varの変数はprivateの変数になります。

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

例:javascriptのクラスの機能をしながら

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 

、私はこれを使用しています。たくさん。しかし それを使っている間に、代わりに の違いを使ってしまったのかどうか疑問に思う。

有意な差があり、あなたがそうでなければ必要としない限り、あなたのクラスのインスタンスに表示しないthisキーワードで変数を作成するべきではありません。それは単純にオーバーヘッドを作成し、計算上の廃棄物であり、Crockfordはそれを呼び出します。

+0

引数のために、私の例で行ったようにreturn {}を追加するとどうなりますか?それは現在、このすべてではなく、機能の公的な範囲になります。 – Kristian

+0

@Kristian:はい、 'return'キーワードを使って返ってほしいものは、外部コードでも利用できます。どのprivate変数や関数を返すかはあなた次第です。パブリック変数はpublicなので、必ず 'return'ブロックに入れるべきではありません。実際には、同じメソッドを使用する 'JavaScript Revealing Pattern'を検索することができます。ところで、 'var myClass = function(){/ * code * /}(); 'のように最後に'() 'を追加しない限り、あなたのコードは機能しません。 – Blaster

+0

私はそれをインスタンス化しています。しかし、私は明らかにパターンを使用しています。これは、いつもの可視性を引き継いでいるように見えます。これは、iveがこの質問をする前にこのような質問をしたことがない理由です。 – Kristian

1

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

+0

私は単純に戻りオブジェクトを使ってカプセル化していませんか? – Kristian

1

継承を行う必要がない場合、クロージャ(varケース)とオブジェクト(このケース)は基本的に同じことを行い、roughly interchangeableです。心に留めておくべき

違い:

  • あなたが変数に保存する場合は、「この」コンストラクタは、「新しい」と呼ばれる必要があると方法はは.callと呼ばする必要が使用したり、それらをコールバックとして渡します。

  • 使用すると、オブジェクトの多くのインスタンス場合は、パフォーマンスの違いがあるかもしれません(5月より優れたオブジェクトと現在のエンジンを - しかし、あなたは、コンストラクタでそれらを設定する代わりに、プロトタイプのメソッドを入れている場合のみ)

  • 変数を宣言しました"var"はプライベートなので、関数の外部ではアクセスできません。時には、これはOKですが、これは継承をやってからあなたを停止することができます

1

this:xは、インスタンス変数のようなものです(「JavaScriptで保護された」という概念はありません)。これらの変数はpublicスコープを持ちます。 OOPのクラス変数として機能します。

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

関連する問題