Nếu bạn thay thế dòng
Me.prototype.constructor = Me; // Why?
với
console.log(Me.prototype.constructor);
Me.prototype.constructor = Me; // Why?
bạn sẽ thấy rằng trước khi đặt nó, Me.prototype.constructor
là You
, vì Me.prototype
là một thể hiện của You
do dòng
Me.prototype = new You();
Vì vậy, dòng thứ e // Why?
nhận xét là cần thiết để "sửa" ấn tượng nhầm lẫn này mà bạn đã đưa ra JavaScript bằng cách thực hiện kế thừa theo cách này.
Về cơ bản vấn đề xuất hiện vì bạn đang cố gắng sử dụng thừa kế nguyên mẫu để thực hiện kế thừa cổ điển. Prototypal kế thừa hoạt động trên các cá thể đối tượng, và không có khái niệm về "lớp" hoặc thậm chí, thực sự, "loại", nhưng JavaScript làm cho mọi thứ thêm khó hiểu với toàn bộ new
, .constructor
và instanceof
doanh nghiệp.
Một cách cụ kỵ hơn để làm điều này là điều mà là để tránh né nhà xây dựng có lợi cho các nhà xây dựng điện, tức là chức năng mà trả về một đối tượng với các hình thức mà bạn mong muốn:
function begetPart(partNumber, description) {
return Object.create({}, {
number: { value: partNumber },
description: { value: description },
describe: {
value: function() {
alert(this.description);
}
}
});
}
function begetTire(partNumber, speed) {
return Object.create(
begetPart(partNumber, "A tire"),
{
speed: { value: speed },
describe: {
value: function() {
alert(this.description + "; speed = " + this.speed);
}
}
}
);
}
var genericPart = begetPart(1234, "A widget");
genericPart.describe(); // alerts "A widget"
var tire = begetTire(4567, "fast");
tire.describe(); // alerts "A tire; speed = fast"
Ở đây chúng ta sử dụng Object.create
để nói " tạo một cá thể đối tượng dựa trên cá thể đối tượng khác này ". Ví dụ khác là một đối tượng trống, mới cho begetPart
và một "phần thể hiện" mới với một số thuộc tính được điền sẵn cho begetTire
. Điều này phản ánh tốt hơn cách JavaScript và sự thừa kế nguyên mẫu thực sự hoạt động, vì trong các cá thể đối tượng thừa kế prototy kế thừa từ các cá thể đối tượng khác, mà không có toàn bộ ý tưởng "kiểu" hoặc "lớp" này cản trở.
Tôi tin rằng các trình duyệt kế thừa kiểm tra thuộc tính '.constructor' cho từ khóa' instanceof'. – Raynos
Đây là một cuốn sách từ năm 2006. –