John Resig 的 JavaScript 继承实现:为什么要“初始化”?

John Resig's JavaScript inheritance implementation: why `initializing`?

我正在研究 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’

function Class() {
    if ( !initializing && this.init )
        this.init.apply(this, arguments);
}

initializing 为真时,你就是 'setting up' Class 对象本身,所以你不想调用每个具体定义的 init 实例方法class.

你可以这样做: var RedCoupe = Class.extend({ 初始化:函数(){ this._type = 'coupe'; this._color = 'red'; }); var myCar = new RedCoupe();

在这种情况下,您希望 new RedCoupe(); 调用 init,但在 defiing var RedCoupe = Class.extend({ ... }); 时不调用,是否有意义?