2012-07-26 35 views
5

Mã dưới đây gần giống với một số mã từ cuốn sách tuyệt vời của Douglas Crockford JavaScript: The Good Parts, từ các trang 29-30. Sự khác biệt duy nhất là ông nói thêm thuộc tính get_status như vậy:Mã của Crockford liên quan đến Mô hình Gọi Constructor

Quo.prototype.get_status=function() { 
    this.status=string; 
} 

Câu hỏi của tôi là lý do tại sao mã của mình chạy OK nhưng sự thay đổi nhỏ của tôi, dưới đây, kết quả trong một lỗi mà nói myQuo không có phương pháp get_status?

<script> 
    var Quo=function(string) { 
    this.status=string; 
    } 
    Quo.get_status=function() { 
    return this.status; 
    } 
    var myQuo=new Quo("confused"); 
    alert(myQuo.get_status()); 
</script> 

Trả lời

8

Bạn đang thêm các phương pháp để đối tượng Quo chức năng, không phải để nguyên mẫu của nó, vì vậy nó sẽ không được thừa hưởng bởi trường hợp tạo ra với new Quo(). Một hàm được thêm vào theo cách này giống như một phương thức tĩnh trong các ngôn ngữ OOP cổ điển - nó có thể được gọi với Quo.get_status(), nhưng nó sẽ không được kế thừa bởi các cá thể và this sẽ tham chiếu đến hàm Quo.

Quo.status = "foo"; 
Quo.get_status(); // "foo" 
+1

Câu hỏi là _why_ get_status không được thêm vào myQuo. Tôi đã biết rằng tôi đã thêm nó vào Quo, không phải nguyên mẫu của nó. –

+5

Các trường hợp không kế thừa các thuộc tính hoặc phương thức của các hàm tạo của chúng - chỉ các thuộc tính và phương thức được gắn vào nguyên mẫu mới được kế thừa. – nrabinowitz

0

Chức năng là đối tượng trong JavaScript. Khi bạn thêm các thuộc tính vào các hàm thì chúng không được kế thừa bởi các cá thể của hàm đó. Tuy nhiên khi bạn thêm thuộc tính vào nguyên mẫu của hàm thì chúng được kế thừa. Để hiểu cách kế thừa dựa trên nguyên mẫu hoạt động trong JavaScript, hãy đọc following answer.

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