2011-08-18 13 views
12

Javascriptでは、オブジェクトに関数を追加する2つの方法に違いはありますか?何らかの理由で好ましいものはありますか?Javascriptオブジェクトに関数を追加するさまざまな方法

function ObjA() { 
    this.AlertA = function() { alert("A"); }; 
} 
ObjA.prototype.AlertB = function() { alert("B"); }; 

var A = new ObjA(); 
A.AlertA(); 
A.AlertB(); 
+0

おそらく重複:http://stackoverflow.com/questions/422476/javascript-setting-methods-through-prototype-object-or-in-constructor-differenc –

+0

本当に重複しています、ありがとうございます。 –

+0

[JavaScriptの 'prototype'と 'this'の使用は可能ですか?](http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) – user2864740

答えて

16

確かに違いがあります。 this.AlertAを定義する場合は、ObjAのインスタンスに対してローカルなメソッドを定義しています。 コンストラクタのプロトタイプにAlertAを追加すると、すべてのインスタンスがObjAに定義されます。後者は、この場合は1回だけ割り当てられるため、より効率的ですが、ObjAのインスタンスを作成するたびにローカルメソッドが割り当てられます。

そうでthis.AlertA使用:コンストラクタメソッドAlertAを追加しなければならないA、B及びCのため

var A = new ObjA, 
    B = new ObjA, 
    C = new ObjA; 

を。一方、AlertBは1回だけ追加されます。これをチェックすることができます:

function ObjA() { 
     alert('adding AlertA!'); 
     this.AlertA = function() { 
      alert("A"); 
     }; 

     if (!ObjA.prototype.AlertB) { 
      alert('adding AlertB!'); 
      ObjA.prototype.AlertB = function() { 
       alert("B"); 
      }; 
     } 
} 

var A = new ObjA, //=> alerts adding AlertA! and alerts adding AlertB! 
    B = new ObjA, //=> alerts adding AlertA! 
    C = new ObjA; //=> alerts adding AlertA! 
3

オブジェクトコンストラクタを使用すると、その関数のコピーがオブジェクトの新しいインスタンスに割り当てられます。プロトタイプを使用すると、すべてのインスタンスで1つの関数が共有されます。

関連する問題