我正在研究John Resig的OOO implementations in 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
的目的。我发现这篇文章有一些解释,但我无法理解:Understanding John Resig's 'Simple JavaScript Inheritance'
有人可以详细解释它的目的吗?比如说,给出一些代码在没有initializing
的情况下失败的情况?
问题解决了。
我撰写了一篇文章来记录细节:Understanding John Resig’s ‘Simple JavaScript Inheritance’
答案 0 :(得分:1)
function Class() {
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
当initializing
为真时,您正在“设置”Class对象本身,因此您不希望调用每个具体类定义的init
实例方法。
您可以这样做: var RedCoupe = Class.extend({ init:function(){ this._type ='coupe'; this._color ='red'; }); var myCar = new RedCoupe();
在这种情况下,您希望new RedCoupe();
调用init,但是在定义var RedCoupe = Class.extend({ ... });
时,它是否有意义?