Подтвердить что ты не робот

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

Я вижу эту красивую диаграмму, и я сделал некоторые тесты в браузере Chrome, но я не знаю, как это объяснить:

> Function.prototype
  function Empty() {}
> Function.__proto__
  function Empty() {}
> typeof(Empty)
  "undefined"

Что такое function Empty() {}, и почему Function.prototype является function не a object так же, как Object.prototype?

Из приведенной выше диаграммы кажется, что все в JavaScript начинается с Object.prototype, я прав, что?

4b9b3361

Ответ 1

Во-первых, представление function Empty() {} V8.

В V8 объект 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

Ответ 2

Чтобы интегрировать превосходный ответ CMS:

Кажется, что все в javascript начинается с Object.prototype, правильно ли я об этом?

Абсолютно, объекты в JavaScript привязаны к основному объекту. Цепочка наследования работает во время выполнения, поэтому, если базовый объект модифицирован, все привязанное к нему наследует изменения немедленно. Если у объекта нет метода или свойства, реализация Javascript будет следовать цепочке прототипов до тех пор, пока она не найдет ее или она не сработает.

__proto__ - это нестандартный аксессор к прототипу, который поддерживается в браузерах, но не IE. Во всяком случае, не предназначен для использования кодом приложения.