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

时间:2015-10-20 05:41:49

标签: javascript oop inheritance prototypal-inheritance

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

1 个答案:

答案 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({ ... });时,它是否有意义?