2010-11-24 5 views
5

可能性の重複:
Use of 'prototype' vs. 'this' in Javascript?"this"と "prototype"を使って関数を割り当てることの違いは何ですか?

私は関数にメソッドを追加し、これらの2種類で混乱しています。例を挙げて説明しましょう。

 
var foo = function(){ 
    this.bar = function(){alert('I am a method')} 
} 

foo.prototype.baz = function(){alert('I am another method')} 

var car = new foo(); 

ここで、私たちは車のためにバズとバーの方法を使うことができます。さて、しかし、それらの違いは何ですか。関数のプロトタイプまたはそのコンストラクタにメソッドを追加する際のニュアンスは何ですか?

おかげ.. prototypeに割り当てられ

答えて

9

機能は、すべてのインスタンスで共有されます。コンストラクタで割り当てられた関数は、インスタンスごとに別々の関数オブジェクトを持ちます。

また、コンストラクタで割り当てられる関数は、コンストラクタの変数とパラメータを使用できます。例えば

var foo = function(param){ 
    this.bar = function() { alert('I can see a parameter: ' + param); }; 
} 

foo.prototype.baz = function() { alert('I can't see foo's parameters'); }; 

var car = new foo("Hi there!"); 
car.bar(); 
1
var foo = function(){ 
    this.bar = function(){alert('I am a method')} 
} 

これは、各FOOインスタンスに独自のバー方法を与えます。だから、第2のケースで

var car1 = new foo(); 
var car2 = new foo(); 
car2.bar = //new function definition here. 
//car1.bar doesn't change. 

foo.prototype.baz = function(){alert('I am another method')} 

あなたは関数fooのプロトタイプチェーンに機能を付加しています。したがって、各インスタンスは同じメソッドを取得します。 bazを変更すると、各インスタンスが同じ機能を継承するため、各インスタンスの機能が変更されます。

第2のアプローチの利点は、継承に関して明らかです。また、最初のアプローチでは、特定のインスタンスごとにメソッドをアタッチしているため、複数のfooインスタンスを作成すると、それぞれのインスタンスが不必要に同じメソッドのコピーを持つため、

+0

**間違った**。インスタンスメンバーを再割り当てすると、そのインスタンスのプロトタイプが非表示になります。 – SLaks

+0

これらの2つの満足のいく答えの後、私は、プロトタイプを持つメソッドを追加すると、すべてのインスタンスがメソッドを共有し、これがメモリ管理の問題であることを理解します。私は正しい? – Fatih

+0

@Lorenzo:何百万というインスタンスを作成しているのでなければ、心配しないでください。 – SLaks

関連する問題