1) Object.create() начинается с создания пустой функции с именем F. Я думаю, что функция — это своего рода объект. Где хранится этот F-объект? Глобально, я думаю.
Нет, он хранится в локальной области видимости функции Object.create
, каждый раз, когда вы вызываете Object.create
, эта функция F
будет создаваться заново.
Вы даже можете создать более эффективную с точки зрения памяти реализацию, сохранив F
в замыкании и повторно используя его:
if (typeof Object.create !== "function") {
Object.create = (function () {
function F() {} // created only once
return function (o) {
F.prototype = o; // reused on each invocation
return new F();
};
})();
}
2) Затем наш oldObject, переданный как o, становится прототипом функции F. Функция (т. е. объект) F теперь «наследуется» от нашего oldObject в том смысле, что разрешение имен будет проходить через него. Хорошо, но мне любопытно, какой у объекта прототип по умолчанию, Object? Верно ли это и для объекта-функции?
У всех объектов есть внутреннее свойство, которое строит цепочку прототипов, это свойство известно как [[Prototype]]
, это внутреннее свойство, хотя некоторые реализации позволяют вам получить к нему доступ, например, в Mozilla, с помощью свойства obj.__proto__
.
Значение по умолчанию [[Prototype]]
при создании нового объекта, т. е. var obj = {};
равно Object.prototype
.
Все функции имеют свойство prototype
. Это свойство используется, когда функция используется в качестве конструктора., вызываемый с помощью оператора new
.
Новый экземпляр объекта создается за кулисами, и этот объект [[Prototype]]
устанавливается в свойство prototype
конструктора.
3) Наконец, F создается и возвращается, становясь нашим newObject. Является ли «новая» операция строго необходимой здесь? Разве F уже не предоставляет то, что нам нужно, или существует критическая разница между функциональными объектами и нефункциональными объектами? Ясно, что с помощью этой техники невозможно создать функцию-конструктор.
Да, в этом методе необходим оператор new
.
Оператор new
— это единственный стандартный способ установить внутреннее свойство [[Prototype]]
объекта. Если вам интересно, как это работает, вы можете взглянуть на [[Construct]]
внутренняя операция.
Что произойдет при следующем вызове Object.create()? Глобальная функция F перезаписывается? Конечно, он не используется повторно, потому что это изменило бы ранее настроенные объекты. И что произойдет, если несколько потоков вызовут Object.create(), есть ли какая-то синхронизация для предотвращения условий гонки на F?
При следующем вызове Object.create
новая локальная функция F
создается только в рамках вызова метода, вам не нужно беспокоиться об состояниях гонки.
Обратите внимание, что эта реализация вряд ли соответствует Object.create
описанной в спецификации ECMAScript 5th Edition, в этом методе вы можете передать дескриптор свойства для инициализации объекта.
Его реализуют все поставщики браузеров (уже доступно в альфа-версиях Firefox 3.7, последних сборках Wekit Nightly и бета-версии Chrome 5), поэтому я бы порекомендовал вам хотя бы проверить, существует ли нативная реализация, прежде чем переопределять ее.
person
Christian C. Salvadó
schedule
04.05.2010