Что такое __proto__ функции?

#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. В любом случае не предназначен для использования кодом приложения.