首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >John的JavaScript继承实现:为什么是‘`initializing`’?

John的JavaScript继承实现:为什么是‘`initializing`’?
EN

Stack Overflow用户
提问于 2015-10-20 05:41:48
回答 1查看 166关注 0票数 2

我正在学习约翰·雷西格的OOO在JavaScript中的实现。守则是这样的:

代码语言: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的目的。我发现这篇文章有一些解释,但我无法理解:理解John的“简单JavaScript继承”

有人能详细解释一下它的目的吗?比方说,给出一些没有initializing代码就会失败的场景

更新

问题解决了。

我写了一篇文章来记录细节:理解John的“简单JavaScript继承”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-20 05:56:01

代码语言:javascript
复制
function Class() {
    if ( !initializing && this.init )
        this.init.apply(this, arguments);
}

initializing为真时,您将“设置”类对象本身,因此不希望调用每个具体类定义的init实例方法。

您可以这样做: var RedCoupe = Class.extend({ init: this._type = 'coupe';this._color = 'red';});var myCar =新的RedCoupe ();

在这种情况下,您希望new RedCoupe();调用init,但不想在违背var RedCoupe = Class.extend({ ... });时调用init,这样做有意义吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33228841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档