2010-02-16 14 views
5

Jestem zdezorientowany pojęciem "prototypu" w javascript.Kiedy należy używać "prototypu" podczas powiększania obiektu w javascript?

Kiedy jestem definiowania obiektu obie następujące czynności wydają się działać:

myObject = {}; 
myObject.prototype.method1 = function() { ... }; 
myObject.prototype.method2 = function() { ... }; 
myObject.prototype.method3 = function() { ... }; 

i ...

myObject = {}; 
myObject.method1 = function() { ... }; 
myObject.method2 = function() { ... }; 
myObject.method3 = function() { ... }; 

Czy ktoś może rzucić nieco światła na to? Czym dokładnie jest różnica między tymi dwoma sposobami tworzenia obiektu i dlaczego wybrałbym jeden nad drugim? (Mam takie uczucie w moim brzuchu, to ważne ...)

Dzięki!

Odpowiedz

8

Należy użyć właściwości prototype tylko na Constructor Functions, a nie w instancji obiektów, na przykład:

function Test() {} 
Test.prototype.method1 = function() {/*...*/}; 

var obj = new Test(); 

Właściwość funkcji konstruktora prototype, jest wykorzystywany przez operatora new, gdy tworzy nasz nowy instancja obiektu.

Wszystkie rodzime obiekty mają ukryte łącze, które buduje łańcuch prototypów.

To ukryte połączenie między obiektami to własność wewnętrzna [[Prototype]], a operator new jest jedynym, który może ją ustawić.

W powyższym przykładzie, obj kojarzy się wewnętrznie z jego prototyp konstruktorze method1 jest dostępny z obj, ale nie istnieje fizycznie na tym obiekcie, że metoda istnieje na obiekcie Test.prototype, i jest pobierane poprzez prototyp łańcuch, np:

typeof obj.method1; // "function" 
obj.hasOwnProperty('method1'); // false 
obj.method1 === Test.prototype.method1; // true 

Na instancji obiektów, przypisywanie właściwości prototype jest bez znaczenia, że ​​zostaną podjęte tak jak każdej innej nazwy właściwości:

var myObject = {}; 
myObject.prototype = "foo"; 
myObject.bar = "bar"; 

// myObject is simply {"prototype":"foo","bar":"bar"} 
+0

Dodałbym, że wiele razy będą metody dodawane wewnętrznie do każdej instancji wewnątrz funkcji Konstruktora przez: this.fn = function() {...}; co jest przydatne do posiadania prywatnych instancji zmiennych, do których można uzyskać dostęp za pomocą metod instancji. – Tracker1

1

Drugi sposób dodaje metody tylko do tego obiektu. Pierwszy sposób czyni go dostępnym dla innych obiektów utworzonych z new tym "typem".

Powiązane problemy