2012-01-30 24 views
6

Hãy nhìn vào đoạn mã sau:Thừa kế JavaScript: Khi nào thành viên của tôi xuất phát từ đâu?

function Primate() { 
    this.prototype = Object; 
    this.prototype.hairy = true; 
} 

function Human() { 
    this.prototype = Primate; 
} 

new Human(); 

Khi bạn kiểm tra new Human(), không có hairy thành viên. Tôi hy vọng sẽ có một. Có cách nào khác tôi giả sử được kế thừa từ Primate không? Một cái gì đó liên quan đến Object.create() (ECMAScript5 là tốt để sử dụng trong kịch bản của tôi)?

+0

Bạn phải đọc để hiểu thừa kế trong js: http://javascript.crockford.com/inheritance.html và http://javascript.crockford.com/prototypal.html – bfavaretto

+1

Bạn đang làm sai. Bạn muốn thao tác các đối tượng 'prototype' của các hàm tạo -' Primate' và 'Human'. Ví dụ mới được tạo ra (giá trị 'this' bên trong constructor) là * not * a function và do đó thêm thuộc tính' prototype' là vô nghĩa. –

+0

Tôi sẽ tạo và mở rộng các đối tượng (với Object.create) thay vì khỉ vá chuỗi nguyên mẫu. Sử dụng các hàm như các hàm tạo có thể dẫn đến nhầm lẫn vì điều này đang thực hiện các đối tượng JavaScript như các cấu trúc giống lớp. – rxgx

Trả lời

4

Khi mã của bạn được viết, các đối tượng được tạo bằng cách sử dụng new Human() sẽ có một thuộc tính được gọi là prototype có giá trị là tham chiếu đến hàm Primate. Đó rõ ràng không phải những gì bạn muốn (và nó không đặc biệt đặc biệt).

Một vài điều:

  • Bạn thường muốn thay đổi prototype của một chức năng đó là dự định được sử dụng như một nhà xây dựng (với các nhà điều hành new). Nói cách khác, bạn muốn đặt prototype trên Human (không phải trên ví dụ của Human).

  • Giá trị bạn gán cho prototype phải là một dụ loại mong muốn (hoặc, nếu không có công việc khởi tạo là cần thiết, kiểu như mong muốn của prototype), không phải là một tài liệu tham khảo để xây dựng nó.

  • Không bao giờ cần phải chỉ định rõ ràng Object (hoặc Object trường hợp) cho hàm prototype của hàm. Điều này là ngầm định.

Bạn có thể muốn một cái gì đó như thế này:

function Primate() { 
    this.hairy = true; 
} 

function Human() {} 
Human.prototype = new Primate(); 
Human.prototype.constructor = Human; 

var h = new Human(); 

Các Human tham chiếu bởi h có một tính chất gọi hairy có giá trị là đúng.

Trong ví dụ trước, hairy chỉ được gán giá trị của nó khi Primate được gọi, đó là lý do tại sao Human.prototype phải được gán một phiên bản Primate. Điều này thay vào đó có thể được viết để không cần khởi tạo như vậy.

Ví dụ:

function Primate() {} 
Primate.prototype.hairy = true; 

function Human() {} 
Human.prototype = Primate.prototype; 
Human.prototype.constructor = Human; 

var h = new Human(); 
Các vấn đề liên quan