2012-03-19 6 views
6

のJavaScriptクラス内の内部変数を宣言することとの違いは何ですか?とvarの違いは何ですか?JavaScriptクラスの変数を宣言します。これはvarと同じです。差?

例:私たちが認識している

function Foo() { 
    var tool = 'hammer'; 
} 

function Foo2() { 
    this.tool = 'hammer'; 
} 

一つの違いはFoo.toolは未定義生む一方Foo2.toolは「ハンマー」が得られますです。

他にも違いはありますか? 1対1のための推薦?

ありがとうございます!

+0

)明らかに、別の目的を果たすことは明らかです。 'this.tool'を使う理由がなければ、' var tool'を使います。 – Blender

+0

ありがとう、ブレンダー!彼らが奉仕するさまざまな目的について精巧に考えてもらえますか? – Crashalot

+0

クラスの外で 'var tool 'を使うことはできないので、クラスの外で使われることはありません。 'this.tool'はクラスの外から呼び出されるように作られています。 – Blender

答えて

14

2つの目的が異なるため、ここでは「どちらか一方」はありません。

はこの考えてみます。OOPで

var Melee = function(){ 

    //private property 
    var tool = 'hammer'; 

    //private method 
    var attack = function(){ 
     alert('attack!'); 
    }; 

    //public property 
    this.weapon = 'sword'; 

    //public methods 
    this.getTool = function(){ 
     return tool; //can get private property tool 
    }; 
    this.setTool = function(name){ 
     tool = name; //can set private property tool 
    }; 
}; 

var handitem = new Melee(); 
var decoration = new Melee(); 

//public 
handitem.weapon;     //sword 
handitem.getTool();    //hammer 
handitem.setTool('screwdriver'); //set tool to screwdriver 
handitem.getTool();    //is now screwdriver 

//private. will yield undefined 
handitem.tool; 
handitem.attack(); 

//decoration is totally different from handitem 
decoration.getTool();   //hammer 
  • handitem.weaponを外部からアクセス可能、 "公共の財産" です。私がMeleeのこのインスタンスを作成した場合、公開されているので、weaponにアクセスして変更できます。

  • handitem.toolは「私有財産」です。オブジェクトの内部からのみアクセスできます。可視ではなく、アクセス可能ではなく、外部から(少なくとも直接的に)変更可能でもありません。それにアクセスしようとすると、返信されます。undefined

  • handitem.getToolは「公開方法」です。それはオブジェクトの内側にあるため、プライベートプロパティtoolにアクセスし、外部からアクセスできます。プライベート世界への橋の一種。

  • handitem.attackはプライベートメソッドです。すべてのプライベートなもののように、内部からのみアクセスできます。この例では、attack()を呼び出す方法はありません(攻撃から安全ですのでD:

+0

ありがとう、Joseph。 Meleeの異なるインスタンスを作成すると、それぞれが独自の「ツール」のコピーを取得するかどうかを明確にするために、それとも、他のものの "ツール"を上書きするのでしょうか? – Crashalot

+0

いいえ、あなたが 'new Melee()'を呼び出すたびに別のオブジェクトが作成されます。一方のプロパティを更新しても他方の値は変更されません。 – Joseph

+1

'new'キーワードを使うと、新しくユニークなオブジェクトが作成され、' Melee'関数に渡されます。したがって、それぞれには独自の 'weapon'プロパティがあります。しかし、@ Joseph'のコードでは、 'tool'変数は関数スコープ変数なので、関数の外から直接変更することはできません。これには 'setTool'メソッドが必要です。 –