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) Далее наш старый объект, переданный как o,
становится прототипом функции F.
Функция (т.е. объект) F сейчас
«наследует» от нашего старого объекта, в
чувствую, что разрешение имен будет направлено
через это. Хорошо, но мне интересно, что
прототип по умолчанию для
Объект Object? Это также верно для
функция-объект?
Все объекты имеют внутреннее свойство, которое создает цепочку прототипов, это свойство известно как [[Prototype]]
, это внутреннее свойство, хотя некоторые реализации позволяют вам получить к нему доступ, например, mozilla, со свойством obj.__proto__
.
Значение по умолчанию [[Prototype]]
при создании нового объекта, т.е. var obj = {};
равно Object.prototype
.
Все функции имеют свойство prototype
, это свойство используется, когда функция используется в качестве Конструктора , вызываемого оператором new
.
Новый экземпляр объекта создается за сценой, и этому объекту [[Prototype]]
присваивается свойство конструктора prototype
.
3) Наконец, создается экземпляр F и
вернулся, став нашим новым объектом. Является
«новая» операция строго необходима
Вот? F уже не предоставляет то, что
нам нужно, или есть критическое
разница между функциями-объектами
и нефункциональные объекты? Ясно это
не будет возможности иметь
функция конструктора, использующая это
техника.
Да, оператор new
необходим в этом методе.
Оператор new
является единственным стандартным способом установить внутреннее свойство [[Prototype]]
объекта. Если вам интересно, как он работает, вы можете посмотреть на [[Construct]]
внутренняя операция.
Что произойдет в следующий раз
Object.create () вызывается? Является глобальным
функция F перезаписана? Конечно, это
не используется повторно, потому что это изменило бы
предварительно настроенные объекты. А также
что произойдет, если вызов нескольких потоков
Object.create (), есть ли
синхронизация для предотвращения гонки
условия по F?
В следующий раз, когда вызывается Object.create
, новая локальная F
функция создается только в рамках вызова метода, вам не стоит беспокоиться о условиях гонки .
Обратите внимание, что эта реализация едва ли соответствует Object.create
, описанному в ECMAScript 5-е издание Спецификация , в этом методе вы можете передать дескриптор свойства для инициализации объекта.
Все поставщики браузеров реализуют его (уже доступно в Firefox 3.7 alphas, последних версиях Wekit Nightly Build и Chrome 5 Beta), поэтому я рекомендую вам хотя бы проверить, существует ли собственная реализация, прежде чем переопределять ее.