Object
là Eve, và Function
là Adam, Adam (Function
) sử dụng xương của mình (Function.prototype
) để tạo Eve (Object
).Sau đó, ai đã tạo ra Adam (Function
)? - Nhà phát minh ngôn ngữ JavaScript :-).
Theo câu trả lời của utsaina, tôi muốn thêm thông tin hữu ích hơn.
Điều đáng ngạc nhiên nhất đối với tôi là phát hiện ra rằng Object.__proto__
điểm để Function.prototype
, thay vì Object.prototype
, nhưng tôi chắc chắn có một lý do chính đáng cho điều đó :-)
nó không nên . Object.__proto__
KHÔNG được trỏ đến Object.prototype
. Thay vào đó, bản sao của Object
o
, o.__proto__
phải trỏ đến Object.prototype
.
(Forgive me cho việc sử dụng các điều khoản class
và instance
trong JavaScript, nhưng bạn biết nó :-)
Tôi nghĩ lớp Object
chính nó là một thể hiện của Function
, đó là lý do tại sao Object.__proto__ === Function.prototype
. Do đó: Object
là Eve và Function
là Adam, Adam (Function
) sử dụng xương của mình (Function.prototype
) để tạo Eve (Object
).
Hơn nữa, ngay cả những lớp Function
chính nó là một thể hiện của Function
bản thân, đó là Function.__proto__ === Function.prototype
, đó cũng là lý do tại sao Function === Function.constructor
Tiếp tục hơn nữa, lớp thường xuyên Cat
là một thể hiện của Function
, đó là Cat.__proto__ === Function.prototype
.
Lý do ở trên là khi chúng tôi tạo một lớp trong JavaScript, trên thực tế, chúng tôi chỉ tạo một hàm, hàm này phải là một phiên bản Function
. Object
và Function
chỉ là đặc biệt, nhưng chúng vẫn là lớp học, trong khi Cat
là một lớp thông thường.
Như một vấn đề của yếu tố, trong công cụ JavaScript của Google Chrome, sau 4:
Function.prototype
Function.__proto__
Object.__proto__
Cat.__proto__
Họ là tất cả ===
(hoàn toàn bình đẳng) đến 3 khác, và giá trị của họ là function Empty() {}
> Function.prototype
function Empty() {}
> Function.__proto__
function Empty() {}
> Object.__proto__
function Empty() {}
> Cat.__proto__
function Empty() {}
> Function.prototype === Function.__proto__
true
> Function.__proto__ === Object.__proto__
true
> Object.__proto__ === Cat.__proto__
true
OK. Sau đó, ai tạo ra đặc biệt function Empty() {}
(Function.prototype
)? Hãy suy nghĩ về nó :-)
[Sơ đồ đồ thị] (http://i.imgur.com/IkxPv.png) này sẽ giúp bạn hiểu sự khác biệt giữa nguyên mẫu và __proto__. Bạn có thể theo chuỗi __proto__ từ đối tượng newtoy, và sau đó bạn sẽ nhận ra lý do tại sao __Proto__ thứ 3 từ newtoy là null. – bits
Cũng rõ ràng từ sơ đồ 'newtoy.prototype' không bằng' newtoy.constructor.prototype' và do đó 'newtoy.constructor.prototype' sẽ không có thuộc tính được gọi là' rating'. Tương tự 'newtoy.constructor.prototype.constructor.property' cũng sẽ không có thuộc tính được gọi là' rating'. – bits
Typo trong nhận xét cuối cùng: do đó 'newtoy.constructor.prototype' sẽ có thuộc tính được gọi là xếp hạng. Tương tự 'newtoy.constructor.prototype.constructor.property' cũng sẽ có thuộc tính được gọi là rating. – bits