Я изучаю реализации Джона Резига OOO в JavaScript. Код выглядит так:
(function(){
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
this.Class = function(){};
Class.extend = function(prop) {
var _super = this.prototype;
initializing = true;
var prototype = new this();
initializing = false;
for (var name in prop) {
// ...
}
function Class() {
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
Class.prototype = prototype;
Class.prototype.constructor = Class;
Class.extend = arguments.callee;
return Class;
};
})();
Проблема в следующем: почему мы используем здесь initializing
?
Я предполагаю, что оператор var prototype = new this();
может быть асинхронным. Таким образом, когда вызывается new ChildClass()
, инициализация (назначение properties
прототипу ChildClass
) может быть не выполнена. Но я совершенно не уверен, правильно это или нет.
После поиска я все еще не могу понять цель использования переменной initializing
. Я обнаружил, что в этой статье есть некоторые пояснения, но я не мог понять: Понимание Джона Резига «Простое наследование JavaScript»
Может ли кто-нибудь подробно объяснить цель этого? Скажем, приведите несколько сценариев, когда код не работает без initializing
?
Обновлять
Задача решена.
Я написал статью, чтобы записать подробности: Понимание "Простого наследования JavaScript" Джона Резига