2010-02-16 34 views
5

Javascript'teki "prototip" kavramı hakkında kafam karıştı. Ben bir nesneyi tanımlayan ettiğimdejavascript'te nesne büyütme işlemi sırasında ne zaman "prototip" kullanmalısınız?

aşağıdakilerin her ikisini de çalışmıyor gibi görünüyor:

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

ve ...

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

kimse bu biraz ışık tutacak misiniz? Bir nesne yaratmanın bu iki yolu arasındaki fark tam olarak nedir ve neden diğerinden birini seçeyim? (Beynimde bu his var, önemli ...)

Teşekkürler! bizim yeni oluşturduğunda yapıcı fonksiyonlarının

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

var obj = new Test(); 

prototype özelliği, new operatör tarafından kullanılmaktadır:

cevap

8

Örneğin, nesne örnekleri değil, sadece Constructor Functions üzerinde prototype özelliğini kullanmalıdır nesne örneği.

Tüm yerel nesnelerin prototip zincirini oluşturan gizli bir bağlantısı vardır.

Nesneler arasındaki bu gizli bağlantı, [[Prototype]] dahili özelliğidir ve new işleci, bunu ayarlayabilen tek kişidir. 's yapıcı prototip ile içten bağlantılıdır obj Yukarıdaki örnekte

, method1 obj erişilebilir, ama değildi bu yöntem Test.prototype nesne üzerinde olup, bu nesne üzerinde fiziksel olarak var olan vermez ve bunun içinden alınan oluyor prototip zinciri, örneğin:

: nesne örnekleri üzerinde

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

, bir prototype özellik atama, sadece herhangi bir başka özellik adı olarak anlamsız alınacaktır edilir 0

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

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

Yapıcı fonksiyonu içerisindeki her bir örneğe dahili olarak eklenen metotlar çok kez eklenecektir: this.fn = function() {...}; Bu, örnek yöntemlerle erişilen özel örnek değişkenlerine sahip olmak için yararlıdır. – Tracker1

1

İkinci yol, yalnızca bu nesneye yöntem ekler. İlk yol, bu "type" ile new ile oluşturulan diğer nesneler için kullanılabilir hale getirir.

İlgili konular