2011-02-09 28 views
16

Trong kế thừa Nguyên mẫu JavaScript, mục đích của việc thêm thuộc tính prototype.constructor là gì. Hãy để tôi giải thích với một ví dụ.Ưu điểm của việc đặt thuộc tính "hàm tạo" trong "nguyên mẫu"

 
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(); 

Các dòng sau luôn trả về luôn đúng trong mọi trường hợp khi thêm Sub.prototype.constructor = Sub hay không.

 
console.log(inst instanceof Sub) // true 
console.log(inst instanceof Super) // true 

Tôi đoán, điều này có thể hữu ích khi nhận các phiên bản mới nhưng khi nào và/hoặc như thế nào?

Xin cảm ơn trước.

+2

câu hỏi tuyệt vời! – tybro0103

Trả lời

10

Chỉ cần đặt lại đúng thuộc tính constructor để phản ánh chính xác chức năng được sử dụng để tạo đối tượng.

Sub.prototype = new Super(); 

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

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

Chính xác thì hậu quả của việc không thiết lập nó là gì? Hay nói cách khác, khi nào giá trị của Sub.prototype.constructor thực sự quan trọng? Nó dường như không ảnh hưởng đến việc tạo ra các trường hợp của Sub ở tất cả, afaics. Đây phải là một trong những điều "rõ ràng" đến mức không ai thực sự tuyên bố nó, và do đó nó đã lảng tránh tôi :-) – Yetanotherjosh

+6

@Yetanotherjosh: tốt, trong trường hợp mã của OP, nếu anh ta để lại dòng đó, sau đó là 'inst.constructor === Super', mặc dù nó được khởi tạo với' new Sub() '. Điều này thường không phải là vấn đề nếu bạn không quan tâm đến thuộc tính đó, nhưng nếu bạn đang chia sẻ cá thể với mã khác thì bạn có thể gây nhầm lẫn trong một số trường hợp, bao gồm cả 'new inst.constructor()' trong một thể hiện của 'Super()' và không phải 'Sub()' (vì vậy nó sẽ thiếu các thuộc tính độc quyền cho 'Sub.prototype'). ** tl; dr đó là một thực hành lập trình tốt **. –

Các vấn đề liên quan