Như những người bình luận khác và các bài báo họ đã liên kết đã đề xuất, thừa kế vi phân là "chỉ" sự thừa kế nguyên mẫu, được biết đến bình thường.
Tuy nhiên, bằng cách sử dụng thuật ngữ thừa kế vi phân bạn tập trung vào một mẫu thuần khiết hơn được biết đến trong JavaScript (mặc dù khá phổ biến ở các ngôn ngữ nguyên mẫu khác như Self, NewtonScript hoặc Io). Không giống như mô hình giả cổ điển, không có nhà thầu nào có sử dụng new
. Thay vào đó, bằng cách sử dụng Object.create
bạn tạo một đối tượng mới kế thừa từ đối tượng đích trong một bước, và sau đó bạn tạo các đặc tính cá thể cần thiết (chỉ những thuộc tính khác nhau) theo cách thủ công (không phải với hàm tạo). Nó không phải là bất thường để kế thừa từ một đối tượng mà bạn sẽ coi là một ví dụ dụ nếu không, thay vì từ một đối tượng nguyên mẫu chuyên dụng.
var object = Object.prototype;
// a Person constructor and a Person.prototype method would be more familiar
var person = Object.create(object);
person.greet = function() {
console.log("Hi, I'm "+this.firstName+" "+this.lastName);
};
// as would new Person("John", "Doe");
var jo = Object.create(person);
jo.firstName = "John";
jo.lastName = "Doe";
// but what now? We stay with "simple" Object.create here
var ja = Object.create(jo);
ja.firstName = "Jane";
jo.greet();
ja.greet();
Như bạn có thể thấy việc tạo Jane đơn giản, nhưng chúng tôi sẽ phải phá vỡ mẫu new Constructor()
nếu chúng tôi đã sử dụng. Đó là lý do tại sao một số chuyên gia JS đang ủng hộ sử dụng mẫu thuần túy ở khắp mọi nơi (để bạn hiểu rõ hơn những gì đang diễn ra) và rất vui khi được cung cấp Object.create
với EcmaScript 5.
Vẫn sử dụng mô hình xây dựng và xây dựng các lớp phân cấp thông thường là phổ biến và hữu ích, và thực sự có thể trong các ngôn ngữ nguyên mẫu. Io ví dụ sẽ gọi một phương pháp init
(nếu tồn tại) mỗi lần bạn clone
một đối tượng, và trong ví dụ trên chúng ta có thể đã sử dụng một cũng đó sẽ làm cho khởi động của Joe đơn giản:
person.init = function(f, l) {
this.firstName = f; this.lastName = l; return this;
}
var jo = Object.create(person).init("John", "Doe");
Có chắc chắn là không có đường thẳng để phân biệt giữa vi phân và nguyên mẫu kế thừa.
Rõ ràng, ["thừa kế vi phân"] (https://en.wikipedia.org/wiki/Differential_inheritance) chỉ là một cách khác để nói "nguyên mẫu thừa kế". – rid
[Điều này có thể mô tả tốt hơn.] (Https://developer.mozilla.org/en/docs/Differential_inheritance_in_JavaScript) –
@SheikhHeera: Thực ra nó không, bởi vì ví dụ được đưa ra không có tác dụng và ít nhất là gây hiểu lầm. – Bergi