【问题标题】:John Resig's JavaScript inheritance implementation: why `initializing`?John Resig 的 JavaScript 继承实现:为什么要“初始化”?
【发布时间】:2015-10-20 05:41:48
【问题描述】:

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

【问题讨论】:

    标签: javascript oop inheritance prototypal-inheritance


    【解决方案1】:
    function Class() {
        if ( !initializing && this.init )
            this.init.apply(this, arguments);
    }
    

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

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

    在这种情况下,您希望new RedCoupe(); 调用init,但在定义var RedCoupe = Class.extend({ ... }); 时却没有,这有意义吗?

    【讨论】:

    • 谢谢。通常,当Class.extend被执行时,initializing被设置为true,然后new,然后被设置为false。如果new总是同步的,当它到达if ( !initializing && this.init )时,initializing的值总是false。如果总是false,为什么要使用它?
    • 是的,对不起,我有点说反了。所以当初始化为真时,就意味着“设置”了Class对象,new this()被赋值给了Class的原型,所以我们不应该调用init实例方法。
    • 在您指出错字时编辑了原帖,谢谢~
    • 感谢您的帮助。但我的问题是:通常initializing 在调用if ( !initializing && this.init ) 语句时总是false,对吗?如果总是false,为什么要使用它?
    • 很高兴有帮助。虽然学习基础 JS 很棒,但如果你不知道,ES6 有一些原生的 OO 支持(es6-features.org)虽然它还没有被所有浏览器完全支持,但很多人使用像 babel(babeljs.io)这样的编译器来编译暂时把它放到 ES5 上。
    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 2012-06-19
    • 2013-01-12
    • 2013-02-09
    • 2016-10-17
    • 2011-04-18
    • 2017-10-21
    • 2023-03-06
    相关资源
    最近更新 更多