Object
- это Ева, а Function
- это Адам, Адам (Function
) использует свою кость (Function.prototype
) для создания Евы (Object
). Тогда кто создал Адама (Function
)? - Изобретатель языка JavaScript: -).
Согласно ответу Усаины, я хочу добавить больше полезной информации.
Самым удивительным для меня было обнаружение, что Object.__proto__
указывает на Function.prototype
вместо Object.prototype
, но я
уверен, что для этого есть все основания: -)
Этого не должно быть. Object.__proto__
НЕ ДОЛЖЕН указывать на Object.prototype
. Вместо этого экземпляр Object
o
, o.__proto__
должен указывать на Object.prototype
.
(Простите за использование терминов class
и instance
в JavaScript, но вы это знаете: -)
Я думаю, что сам класс Object
является экземпляром Function
, поэтому Object.__proto__ === Function.prototype
. Следовательно: Object
- это Ева, а Function
- это Адам, Адам (Function
) использует свою кость (Function.prototype
), чтобы создать Еву (Object
).
Кроме того, даже сам класс Function
является экземпляром самого Function
, то есть Function.__proto__ === Function.prototype
, поэтому также Function === Function.constructor
Более того, обычный класс Cat
является экземпляром Function
, то есть Cat.__proto__ === Function.prototype
.
Причина вышеизложенного состоит в том, что когда мы создаем класс в JavaScript, фактически мы просто создаем функцию, которая должна быть экземпляром Function
. Object
и Function
- это просто особые, но они все еще классы, в то время как Cat
- обычный класс.
Фактически, в движке Google Chrome JavaScript следующие 4:
Function.prototype
Function.__proto__
Object.__proto__
Cat.__proto__
Все они ===
(абсолютно равны) другим 3, и их значение равно 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. Тогда кто создает специальное function Empty() {}
(Function.prototype
)? Подумай об этом: -)