Tôi có nền Java và gần đây tôi đã thử nghiệm với việc thừa kế JavaScript. Tôi bắt đầu viết một số đối tượng và sau khi đọc một số ví dụ, tôi đã tìm thấy kiểu mã phù hợp nhất với tôi.Tại sao sử dụng Object.create cho mẫu thử nghiệm khi mở rộng một đối tượng?
Dưới đây là những gì tôi có:
var Class = function() {};
Class.extend = function(p_constructor) {
var Superclass = this;
// the following line confuses me
p_constructor.prototype = Object.create(Superclass.prototype);
p_constructor.prototype.constructor = p_constructor;
p_constructor.extend = Superclass.extend;
return p_constructor;
};
Vì vậy, bây giờ khi tôi muốn xác định một đối tượng mà mở rộng loại I chỉ cần gõ:
var Person = Class.extend(function(p_firstName, p_lastName) {
this.firstName = p_firstName;
this.lastName = p_lastName;
});
và sau đây sẽ là sự thật:
var p = new Person('john', 'smith');
p instanceof Person; // true
p instanceof Class; // true
Tôi chỉ gặp khó khăn khi hiểu ef là gì Sự khác biệt fective giữa các dòng sau trong Class.extend
chức năng:
/* 1) */ p_constructor.prototype = new Superclass();
/* 2) */ p_constructor.prototype = Superclass.prototype;
/* 3) */ p_constructor.prototype = Object.create(Superclass.prototype);
/* 4) */ p_constructor.prototype = Object.create(Superclass);
tôi nhận ra rằng việc sử dụng dòng 1 không phải là rất khôn ngoan nếu một số siêu constructors ném lỗi, nhưng chính xác sự khác biệt giữa các dòng 2, 3 và 4 là gì?
mát mà bạn đã trả lời câu hỏi của bạn ở đây.Trong khối mã cuối cùng của bạn, hãy xem xét ngữ cảnh của hàm tạo hàm của lớp cha khi bạn gọi nó theo cách này; Tôi nghĩ rằng những gì bạn muốn làm là 'this.superclass.apply (this, arguments);' - sau đó, nếu hàm tạo của super đi 'this.sumthin = ...', giá trị được gắn vào cá thể của lớp con. – dalgard
Các giá trị từ superclass sẽ được gắn vào instance hiện tại của phân lớp, bởi vì nó được gọi từ 'this', do đó, context của nó sẽ thực sự là cùng một instance mới của subclass. – jeremija
Ồ, bạn nói đúng. Tôi nghĩ rằng tôi thấy mô hình này để truy cập vào siêu thường xuyên hơn: 'subclass.prototype.super = superclass.prototype' (có thể với việc bổ sung' subclass.super = superclass'). Có thể bạn sẽ muốn xem [giải pháp của tôi] (https://gist.github.com/dalgard/9169923) cho những điều này (xem ví dụ trong phần bình luận). – dalgard