2011-08-18 16 views
12

W JavaScript jest jakaś różnica między tymi dwoma sposobami dodawania funkcji do obiektu? Czy jest lepszy z jakiegokolwiek powodu?Różne sposoby dodawania funkcji do obiektu JavaScript

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

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

Possbible duplikat: http://stackoverflow.com/questions/422476/javascript-setting-metody-przez -prototyp-object-or-constructor-differenc –

+0

Powiel się, dziękuję. –

+0

możliwy duplikat [użycia "prototypu" kontra "tego" w JavaScript?] (Http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) – user2864740

Odpowiedz

16

Na pewno jest różnica. Jeśli zdefiniujesz this.AlertA, definiujesz metodę, która jest lokalna dla instancji ObjA. Jeśli dodasz AlertA do prototypu konstruktora ObjAkonstruktora, jest on zdefiniowany dla każdego wystąpienia ObjA. Ta druga metoda jest w tym przypadku bardziej wydajna, ponieważ jest przypisana tylko raz, a lokalna metoda jest przypisywana za każdym razem, gdy tworzysz instancję ObjA.

Więc za pomocą this.AlertA w:

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

dla A, B i C, konstruktor musi dodać metodę AlertA. Z drugiej strony, AlertB jest dodawany tylko raz. Można to sprawdzić, używając:

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

Użycie konstruktora obiektu spowoduje przypisanie kopii tej funkcji do każdej nowej instancji obiektu. Korzystanie z prototypowania spowoduje udostępnienie jednej funkcji we wszystkich instancjach.

Powiązane problemy