Каково начальное значение свойства prototype функции JavaScript? - PullRequest
6 голосов
/ 02 ноября 2010

Я знаю, что свойство prototype функциональных объектов JavaScript копируется во внутреннее свойство [[Prototype]] (a.k.a. __proto__) объектов, созданных с использованием функции в качестве конструктора. Итак, я могу установить это свойство для любого объекта, который я хочу использовать в качестве прототипа:

function Foo() {}
Foo.prototype = {
  toString: function() { return "I'm a Foo!"; }
}
new Foo().toString()
// --> "I'm a Foo!"

Кажется, что широко распространенной практикой является добавление функций, которые должны действовать как методы класса, к существующему прототипу вновь сгенерированных функций, например:

function Bar() {}
Bar.prototype.toString = function() {
  return "I'm a Bar!";
}
new Bar().toString()
// --> "I'm a Bar!"

Однако мне неясно, каково начальное значение *1013* свойства prototype.

function Baz() {}
Baz.prototype
// --> Baz {
//       constructor: function Baz() {},
//       __proto__: Object
//     }

Комментарий показывает, что печатает консоль Chrome на JavaScript. Означает ли это, что каждая функция, которую я создаю, на самом деле создает два объекта? Один для самой функции (constructor) и один для ее прототипа?

Это определено где-то в стандарте ECMAScript? Я пытался найти это, но не смог. Все ли браузеры обрабатывают это одинаково?

1 Ответ

10 голосов
/ 02 ноября 2010

Начальное значение prototype для любого вновь созданного экземпляра Function является новым экземпляром Object, но с собственным свойством constructor, установленным для указания на новую функцию.

Это описано в типичной полностью нечитаемой спецификации ECMAScript в ECMA262-5 в разделе 13.2:

(16.) Пусть proto будет результатом создания новогообъект, который будет создан выражением new Object(), где Object - это стандартный встроенный конструктор с таким именем

(17.) Вызвать внутренний метод [[DefineOwnProperty]] proto с аргументами "конструктор", дескриптор свойства {[[Value]]: F, {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true} и false.

(18.) Вызвать внутренний метод [[DefineOwnProperty]] для F с аргументами «prototype», дескриптор свойства {[[Value]]: proto, {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} и false.

...