2011-02-09 20 views
16

JavaScript Prototype devralma işleminde prototype.constructor özelliğinin eklenmesinin amacı nedir? Bir örnekle açıklamama izin ver. Sub.prototype.constructor = Sub ekleme veya değilken "Yapılandırıcı" ayarının "prototip" özelliğindeki avantajları

 
var Super = function() { 
    this.superProperty = 'Super Property' 
} 
var Sub = function() { 
    this.subProperty = 'Sub Property' 
} 

Sub.prototype = new Super(); 
Sub.prototype.constructor = Sub; // advantages of the statement 

var inst = new Sub(); 

aşağıdaki satırları

, tüm durumda her zaman doğru dönün.

 
console.log(inst instanceof Sub) // true 
console.log(inst instanceof Super) // true 
Sanırım yeni örnekler alınırken yararlı olabilir, ne zaman ve/veya nasıl?

Şimdiden teşekkürler.

+2

büyük soru! – tybro0103

cevap

10

Bu, yalnızca nesneyi oluşturmak için kullanılan işlevi doğru şekilde yansıtmak için constructor özelliğini doğru şekilde sıfırlamaktır.

Sub.prototype = new Super(); 

console.log(new Sub().constructor == Sub); 
// -> 'false' 

Sub.prototype.constructor = Sub; 
console.log(new Sub().constructor == Sub); 
// -> 'true' 
+2

Tam olarak ayarlamamanın sonucu nedir? Başka bir deyişle, Sub.prototype.constructor değeri ne zaman gerçekleşir? Hiç Sub olaylarının yaratılmasını etkilemiyor gibi görünüyor, afaics. Bu, hiç kimsenin bunu tam olarak açıklayamadığı "çok bariz" olanlardan biri olmalı ve bu yüzden de bana öyleydi :-) – Yetanotherjosh

+6

@Yetanotherjosh: Peki, OP'nin kodu durumunda, eğer o çizgiyi bırakırsa, o zaman 'sub subat' (new Sub() 'ile başlatılmış olsa bile' inst.constructor === Super'. Bu özelliği umursamıyorsanız, bu genellikle bir sorun olmaz, ancak örneği başka bir kodla paylaşıyorsanız, bazı durumlarda karışıklıklara neden olabilirsiniz, örneğin, yeni inst.constructor() 'ın sonuçlanacağı durumlar da dahil olmak üzere. 'Super() 've' Sub()' örneğinde (yani "Sub.prototype" özel özelliklerinin eksik olması gibi). ** tl, dr iyi bir programlama uygulamasıdır **. –

İlgili konular