2013-07-21 59 views
8

Điều này answer on Object.create() method in JavaScript in SO cuộc đàm phán về thừa kế vi sai. Nó tiếp tục để nói điều này:Thừa kế vi phân trong JavaScript là gì?

Phương pháp này cho phép bạn dễ dàng thực hiện thừa kế vi phân, nơi các đối tượng có thể kế thừa trực tiếp từ các đối tượng khác.

Theo như tôi biết JavaScript luôn cho phép đối tượng được kế thừa trực tiếp từ các đối tượng khác thông qua kế thừa prototypal. Không có khái niệm về một lớp lớp trong JavaScript. Vì vậy, những gì hiện thừa kế vi sai thực sự có ý nghĩa và tại sao nó được gọi là như vậy?

P.S: Tôi đã bỏ một nhận xét về câu trả lời đó một thời gian nhưng tôi không nhận được bất kỳ câu trả lời nào. Vì vậy, muốn kiểm tra với cộng đồng người dùng SO JavaScript lớn hơn và tuyệt vời hơn.

+6

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

+1

[Điều này có thể mô tả tốt hơn.] (Https://developer.mozilla.org/en/docs/Differential_inheritance_in_JavaScript) –

+0

@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

Trả lời

8

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ânnguyên mẫu kế thừa.

+0

Thay vì sử dụng 'init()', 'Object.create()' có đối số thứ hai: các thuộc tính. Điều này có thể được sử dụng để cư trú các thuộc tính cá thể thanh lịch hơn, như được mô tả trong liên kết OP (http://stackoverflow.com/questions/2709612/using-object-create-instead-of-new/2709811#2709811). – Ben

+1

@Steve: Thanh lịch hơn? Tôi nghi ngờ như vậy, vì nó mất * tài sản descriptors * không đơn giản tài sản. Điều đó bao gồm rất nhiều boilerplate nếu bạn muốn "bình thường" (có thể ghi, enumerable) tài sản. – Bergi

+0

đúng, điểm tốt - rất nhiều chi phí ở đó :) – Ben

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