Tôi mới sử dụng JavaScript OOP. Bạn có thể giải thích sự khác biệt giữa các khối mã sau không. Tôi đã thử nghiệm và cả hai khối đều hoạt động. Thực hành tốt nhất là gì và tại sao?Hiểu sự thừa kế nguyên mẫu trong JavaScript
khối đầu tiên:
function Car(name){
this.Name = name;
}
Car.prototype.Drive = function(){
document.write("My name is " + this.Name + " and I'm driving. <br />");
}
SuperCar.prototype = new Car();
SuperCar.prototype.constructor = SuperCar;
function SuperCar(name){
Car.call(this, name);
}
SuperCar.prototype.Fly = function(){
document.write("My name is " + this.Name + " and I'm flying! <br />");
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
khối thứ hai:
function Car(name){
this.Name = name;
this.Drive = function(){
document.write("My name is " + this.Name + " and I'm driving. <br />");
}
}
SuperCar.prototype = new Car();
function SuperCar(name){
Car.call(this, name);
this.Fly = function(){
document.write("My name is " + this.Name + " and I'm flying! <br />");
}
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
Tại sao tác giả thêm Drive
và Fly
phương pháp sử dụng prototype
, nhưng không khai báo như this.Drive
phương pháp bên Car
lớp và this.Fly
trong lớp học SuperCar
?
Tại sao SuperCar.prototype.constructor
cần được đặt lại thành SuperCar
? Thuộc tính hàm tạo có bị ghi đè khi prototype
được đặt không? Tôi nhận xét ra dòng này và không có gì thay đổi.
Tại sao gọi Car.call(this, name);
trong số SuperCar
hàm tạo? Sẽ không tài sản và phương pháp Car
được 'thừa hưởng' khi tôi làm
var myCar = new Car("Car");
Cách hiện đại hơn là sử dụng để Object.create () thay vì mới: http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon
Chỉ cần một lưu ý ví dụ này có thể gây nhầm lẫn: 'siêu' trong trường hợp này đề cập đến một chiếc xe bay, trong khi 'siêu' trong OOP thường đề cập đến nguyên mẫu/lớp cha mẹ. – mikemaccana
Tôi nghĩ rằng phần làm cho sự thừa kế nguyên mẫu của JavaScript khó hiểu là nơi nó kết hợp nó với một hàm tạo. Điều gì sẽ xảy ra nếu chúng ta loại bỏ ý tưởng của hàm tạo và lớp, và chúng ta chỉ có các đối tượng. Mỗi đối tượng được thừa kế từ không có gì (null) hoặc từ một đối tượng khác. Điều đó sẽ dễ hiểu hơn rất nhiều, và đó chính xác là những gì mà Object.create() làm. –