2017-01-23 6 views
-2

する必要があります 'この。または 'var'を使用してJavascriptクラスの変数を作成するか、どちらが使用されても問題ありません。明らかにこれで定義されたもの。オブジェクトの外側からアクセス可能ですが、varで定義されたオブジェクトは他の違いはありません。コメントでJavaScriptのクラス変数 - これ。またはvar

function myClass2() { 
 
\t var count = 0; 
 
\t var oTimer = null; 
 
    this.getCount = function() { return(count); } 
 
} 
 
oMyObj = new myClass2(); 
 
oMyObj.getCount(); // returns 0

+2

'var'はカウントを隠します。 'this.count'については、' oMyObj.count'を実行することでcountにアクセスできます。javascriptスコープとクロージャについて読んでください。 –

+0

レキシカルスコープの私の友人:) – jdmdevdotnet

+2

それは完全にあなたが望む可視性に依存します。 "this"の使用は "これはこのクラスの目に見えるメンバー"を意味します。また、その意図を他の開発者に伝えます。 「var」を使用することは、「外部で使用しない」ことを意味します(また、その意図を伝達します)。しかし、JavaScriptでは、最終的には、開発者がどのように非表示にしようとしたかにかかわらず、一般的にどのデータでも取得できることに注意してください。モジュールのパターンなどは、コンパイル時の違反などを捕らえるためには長い道のりを歩んでいます。 –

答えて

2

ドミニクより詳細に、より少し説明しようとは対照的に

function myClass() { 
 
\t this.count = 0; 
 
\t this.oTimer = null; 
 
    this.getCount = function() { return(this.count); } 
 
} 
 
oMyObj = new myClass(); 
 
oMyObj.getCount(); // returns 0

varキーワードを使用すると、変数は実行されているスコープ内でのみ有効です。つまり、コンストラクタが実行された後(関数本体)、変数は(コンストラクタ内でのみ有効なので)失われます。

コンストラクタ外の変数(メンバーメソッドなど)にアクセスするには、thisキーワードを使用して変数をクラス自体にバインドする必要があります。クラスのスコープは、コンストラクタだけでなく、クラスそのものです。


編集:さらに説明する

:あなたは、彼らが(質問の例を参照)と同じスコープで定義されているので、あなたはまた、コンストラクタ内で宣言されたメソッドの内部varで宣言された変数を使用することができますが、 Function.prototypeで追加する他の追加方法ではアクセスできません。

これを示すために、私は少しJSFiddle example

を作成しているので、クラスのすべての変数を定義するために、一般的に、より良い習慣です(あなたはコンストラクタの内部のように一時変数を使用するだけでなく、意思を行うこと)とthisキーワード。

+0

Michaelは、その理論をテストしましたが、varで宣言された変数は、これで宣言されたものと同じように、メンバーメソッドで実際に見えるように見えます。デモのために元の投稿の例を編集します。 – NickC

+1

@ NickC yeaしかし、同じスコープ(コンストラクタ)でメソッドを定義したからです。このフィドルを見て、私がメンバー・メソッド(プロトタイプを介して)を追加する別の方法を試してみました:https://jsfiddle.net/oo2gamzn/1/。関数本体の中でメソッドを定義するときにはvarsで動作するかもしれませんが、コンストラクタの外側で使用される変数に 'this'を使用するほうがよいでしょう。 –

+0

Michael、違いを完全に説明するjsfiddleのおかげで、今分かります。私は違いがあったと感じましたが、それが何であるかを理解できませんでした。乾杯、 これを回答として繰り返したいのであれば、それを受け入れられた解決策としてマークすることができます。 – NickC

関連する問題