与闭包共享构造函数参数

Sharing constructor parameters with closure

我想了解为什么其中一个版本有效而​​另一个版本无效。为什么进行 getConfigFails 赋值是非法的?

var MyClass = (function(){
    var _config;
    function MyClass(config){
        _config = config;
    }
    MyClass.prototype.getConfigWorks = function(){
        _config.getConfigWorks();
    }
    //Uncaught TypeError: Cannot read property 'getConfigFails' of undefined
    MyClass.prototype.getConfigFails = _config.getConfigFails;
    return MyClass;
})();
var myClass = new MyClass({
    getConfigWorks:function(){
        console.log('no errors here');
    },
    getConfigFails: function(){ console.log('fail')}
});

console.log(myClass);

您应该首先注意您的构造函数不是 (function(){})() 函数,而是 function MyClass(){} 函数。外部自调用函数只是为了创建一个闭包以使 _config 私有。

知道这一点。很明显,如果我们不关心 _config 是否私有,代码也应该可以工作,不是吗?也就是说,如果_config是一个全局变量,逻辑是一样的。

所以,如果我们可以让_config是全局的,你的代码就是这样:

var _config;
function InnerClass(config){
    _config = config;
}
InnerClass.prototype.getConfigWorks = function(){
    _config.getConfigWorks();
}
//Uncaught TypeError: Cannot read property 'getConfigFails' of undefined
InnerClass.prototype.getConfigFails = _config.getConfigFails;

var MyClass = InnerClass;

var myClass = new MyClass({
    getConfigWorks:function(){
        console.log('no errors here');
    },
    getConfigFails: function(){ console.log('fail')}
});

console.log(myClass);

这样写的。 _config.getConfigFails 未定义的原因很明显。那是因为你还没有给它赋值。

重要的是要记住,调用 new MyClass() 只是调用构造函数,而不是它周围的任何代码。因此,如果您将上述代码重新包装在 IIFE 中,逻辑不会改变,只会调用构造函数,而不是 IIFE。