#javascript
#javascript
Вопрос:
Я вижу эту красивую диаграмму, и я провел несколько тестов в своем браузере Chrome, но я не знаю, как это объяснить:
> Function.prototype
function Empty() {}
> Function.__proto__
function Empty() {}
> typeof(Empty)
"undefined"
Что такое function Empty() {}
и почему Function.prototype
function
не object
так же, как Object.prototype
a?
Из приведенной выше диаграммы кажется, что все в JavaScript начинается с Object.prototype
, я прав в этом?
Комментарии:
1. Ответ на эту загадку — в этой Функции. __прото__.__прото__ === Объект.прототип. Но вы не доберетесь туда через Function.constructor.prototype , потому что для этого было установлено значение undefined (или не установлено вообще).
2. 1 Я всегда думаю, что самый простой способ что-то объяснить — это нарисовать картинку / диаграмму и позволить ей говорить. Спасибо, что прикрепили сюда схему!
Ответ №1:
Во-первых, function Empty() {}
представление — это материал V8.
В версии 8 Function.prototype
объект имеет "Empty
«в качестве значения Function.prototype.name
свойства, поэтому я предполагаю, что вы, вероятно, используете консоль разработчика Chrome, и она отображает имя функции таким образом.
name
Свойство объектов функций является non-standard
(не является частью ECMA-262), вот почему мы видим различия между реализациями.
Теперь, Function.prototype
это функция, которая возвращает всегда undefined
и может принимать любое количество аргументов, но почему?. Может быть, просто для согласованности, прототип каждого встроенного конструктора похож на этот, Number.prototype
является Number
объектом, Array.prototype
является Array
объектом, RegExp.prototype
является RegExp
объектом и так далее…
Единственное различие (например, между любым объектом функции и Function.prototype
) заключается в том, что он, очевидно, Function.prototype
наследуется от Object.prototype
.
кажется, все в javascript начинается с Object.prototype, я прав в этом?
Ну, вы правы, Object.prototype
это последний объект цепочки прототипов большинства объектов, но в ECMAScript 5 вы даже можете создавать объекты, которые ни от чего не наследуются (точно так же, как Object.prototype
есть), и формировать другую цепочку наследования, например:
var parent = Object.create(null),
child = Object.create(parent);
Object.prototype.isPrototypeOf(parent); // false
Object.getPrototypeOf(parent); // null
Object.getPrototypeOf(Object.prototype); // null
Комментарии:
1. На самом деле мне все еще любопытно узнать, почему консоли обычно отображают тип Function.prototype как функцию, а все другие типы RegExp, String , Number как объект. Я знаю, что вы упоминали об этом, но для согласованности?? Пожалуйста, пролейте на это больше света
2. @Gurjit,
typeof Function.prototype == 'function'
потому чтоtypeof
оператор возвращает ‘function’, когда вы используете его для «вызываемого объекта» (функции). И вы можете явно вызвать его:Function.prototype() === undefined
.
Ответ №2:
Для интеграции CMS отличный ответ:
кажется, все в javascript начинается с Object.prototype, я прав в этом?
Безусловно, объекты в JavaScript привязаны к базовому объекту. Цепочка наследования работает во время выполнения, поэтому, если базовый объект изменен, все, что связано с ним, мгновенно унаследует изменения. Если у объекта нет метода или свойства, реализация Javascript будет следовать цепочке прототипов, пока не найдет его, иначе произойдет сбой.
__proto__
является нестандартным средством доступа к прототипу, который поддерживается во всех браузерах, но не IE. В любом случае не предназначен для использования кодом приложения.