2014-06-13 32 views
5

Vâng, tất cả thời gian tôi cho rằng thuộc tính nguyên mẫu tồn tại ở tất cả các đối tượng. Nhưng sau một cuộc phỏng vấn xin việc, tôi đã về nhà và mở bàn điều khiển chromeTrường hợp thuộc tính `nguyên mẫu` được xác định

window.prototype 
**undefined** 

WTF?

Object.prototype 
**Object {}** 

OK

var a = {}; 
a.prototype 
**undefined** 

var a = function(){} 
a.prototype 
**Object {}** 

Tôi đã đọc https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype nhiều lần nhưng vẫn không rõ ràng. Ai có thể giải thích?

Thanx

P.S. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

Tất cả các đối tượng trong JavaScript đều xuất phát từ đối tượng; tất cả các đối tượng kế thừa phương pháp và tài sản từ Object.prototype, mặc dù họ thể được ghi đè (trừ một đối tượng với một nguyên mẫu null, tức là Object.create (null)

cửa sổ là Object, vì vậy nó phải có nguyên mẫu tài sản

Trả lời

7

Đối tượng một trường hợp được thừa hưởng từ, nguyên mẫu của nó, được lưu trữ trong một tài sản nội bộ, [[Prototype]]. giá trị của nó có thể được lấy ra với Object.getPrototypeOf() (trong công cụ ES5 tương thích).

console.log(Object.getPrototypeOf(window)); 
// Window { ... } 

var a = {}; 
console.log(Object.getPrototypeOf(a)); 
// Object { ... } 

Chỉ function s rõ ràng có một prototype property:

console.log(typeof Object); 
// 'function' 

Và, giá trị của prototype chỉ được sử dụng để thiết lập giá trị của instance của [[Prototype]] khi một trường hợp new được tạo ra.

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

console.log(Foo.prototype === Object.getPrototypeOf(bar)); // true 
+1

và quyền truy cập theo ký hiệu .prototype là gì? Tôi nghĩ rằng, Object.getPrototypeOf trở lại ._proto_ bất động sản isnt nó? –

+1

@VasilVanchuk, myObject .__ proto__ thực hiện tương tự như Object.getPrototypeOf (myObject) trong các trình duyệt cũ hơn nhưng không được chấp nhận. Xem https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto –

+1

@VasilVanchuk 1) 'Hàm' 'chỉ có thuộc tính' prototype' để các trường hợp kế thừa từ đối tượng thay vì bản thân hàm tạo. Tuy nhiên, bất kỳ đối tượng nào cũng có thể được sử dụng làm nguyên mẫu của một đối tượng khác ([Object.create() '] (http://ecma-international.org/ecma-262/5.1/#sec-15.2.3.5)), do đó, Thuộc tính 'prototype' không cần thiết và thường sẽ không được tìm thấy. 2) Và, yeah, 'getPrototypeOf()' và '__proto__' sẽ cung cấp cùng một giá trị. Tuy nhiên, '__proto__' không chuẩn và đã không được chấp nhận trong một số trình duyệt hỗ trợ. –

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