5

xem xét:Tại sao các hàm đáp ứng với .prototype nhưng các đối tượng thông thường thì không?

function Foo() {} 
var x = new Foo(); 

tại x và Foo có nguyên mẫu giống nhau, nhưng chỉ Foo đáp ứng .prototype:

Object.getPrototype(x) === Foo.prototype // true 
x.prototype === Foo.prototype // false 

Foo.prototype // Foo {} (depending on which browser) 
x.prototype // undefined 

Tại sao không x.prototype làm việc, nhưng Foo.prototype không làm việc?

+0

'x.constructor.prototype == Foo.prototype' – dandavis

+0

Thực tế' x' và 'Foo' không có cùng nguyên mẫu: nguyên mẫu của' Foo' là 'Function.prototype'. Bạn có câu trả lời hay, một số nghiên cứu về "chuỗi nguyên mẫu javascript" sẽ giúp bạn. – traktor53

Trả lời

5

prototype là thuộc tính của các hàm tạo để xác định nguyên mẫu của các đối tượng mới được tạo bởi hàm tạo đó sẽ là gì. Nó chỉ hữu ích khi có một thuộc tính như vậy trên một hàm tạo.

Chừng nguyên mẫu trên các nhà xây dựng đã không được thay đổi:

Object.getPrototypeOf(x) === Foo.prototype 

và đó là giống như:

Object.getPrototypeOf(x) === x.constructor.prototype 

Lưu ý rằng thường:

Object.getPrototypeOf(Foo) != Foo.prototype 
+0

dòng cuối cùng có vẻ hữu ích nhất, đặc biệt là thực tế là 'Foo.protoype' là * NOT * nguyên mẫu của Foo, nhưng nguyên mẫu của các đối tượng được xây dựng * với * Foo. Tôi có đúng không? – user2316560

+0

@ user2316560 Vâng, điều đó nghe có vẻ đúng. – Paulpro

1

Dài câu chuyện ngắn: chức năng có nghĩa là cho newprototype, trường hợp đối tượng không.

Có lẽ tôi sẽ thất bại về độ chính xác khi nói điều này, nhưng prototype là thứ chỉ áp dụng cho những gì bạn có thể gọi hàm dựng, đó là các hàm được gọi với new để tạo các phiên bản. Nguyên mẫu có thể được coi là mẫu cho cá thể kết quả.

Đối với đối tượng kết quả, prototypekhông thuộc tính. Thay vào đó, các thuộc tính trong nguyên mẫu của hàm tạo có sẵn dưới dạng thuộc tính trên cá thể đã được tạo. Có nghĩa là khi bạn tra cứu một thuộc tính trên cá thể, nếu nó không được định nghĩa trên cá thể, Javascript sẽ bắt đầu kiểm tra chuỗi nguyên mẫu để xem nó có được định nghĩa ở đó hay không.

Nếu bạn muốn truy cập nguyên mẫu của một phiên bản, hãy sử dụng Object.getPrototypeOf.

Ngữ nghĩa của Javascript có thể gây nhầm lẫn. Tôi rất khuyên bạn nên làm việc thông qua việc đọc miễn phí Javascript Allongé như một cách để hiểu thấu đáo một số điểm tốt hơn của Javascript. Chương 8 tập trung vào chính xác chủ đề này.

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