Где определено свойство `prototype`

Ну, я все время предполагал, что свойство прототипа существует у всех объектов. Но после одного из собеседований я пришел домой и открыл хромированную консоль.

window.prototype
**undefined**

ВТФ?

Object.prototype
**Object {}**

OK

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

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

Я прочитал https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype несколько раз, но все еще не ясно. Кто-нибудь может объяснить?

спасибо

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

Все объекты в JavaScript происходят от Object; все объекты наследуют методы и свойства от Object.prototype, хотя они могут быть переопределены (кроме объекта с нулевым прототипом, т.е. Object.create(null)

окно является объектом, поэтому оно должно иметь свойство прототипа


person Vasiliy Vanchuk    schedule 13.06.2014    source источник


Ответы (1)


Объект, от которого наследуется экземпляр, его прототип хранится во внутреннем свойстве [[Prototype]]. Его значение можно получить с помощью Object.getPrototypeOf() (в ES5-совместимом двигатели).

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

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

Только function явно имеют prototype свойство:

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

И значение prototype просто используется для установки значения экземпляра [[Prototype]] при создании экземпляра new.

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

console.log(Foo.prototype === Object.getPrototypeOf(bar)); // true
person Jonathan Lonowski    schedule 13.06.2014
comment
а как насчет доступа по нотации .prototype? Я думаю, Object.getPrototypeOf возвращает свойство ._proto_, не так ли? - person Vasiliy Vanchuk; 13.06.2014
comment
@VasilVanchuk, myObject.__proto__ делает то же самое, что и Object.getPrototypeOf(myObject) в старых браузерах, но не рекомендуется. См. developer.mozilla.org/en-US. /docs/Web/JavaScript/Справочник/ - person I-Lin Kuo; 13.06.2014
comment
@VasilVanchuk 1) Function имеют только свойство prototype, поэтому экземпляры наследуют его от объекта, а не от самого конструктора. Но любой объект можно использовать как прототип другого (Object.create()< /a>), поэтому свойство prototype в противном случае не требуется и обычно не встречается. 2) И да, getPrototypeOf() и __proto__ дадут одно и то же значение. Но __proto__ нестандартен и устарел в некоторых поддерживающих браузерах. - person Jonathan Lonowski; 13.06.2014
comment
О функциях есть только свойство прототипа - я так и думал, можете ли вы дать мне ссылку на доказательство? Спасибо - person Vasiliy Vanchuk; 14.06.2014