使用闭包共享构造函数参数

时间:2015-04-07 02:39:27

标签: javascript closures

我试图理解为什么其中一个版本有效,而另一个版本没有。为什么进行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);

1 个答案:

答案 0 :(得分:1)

您应该首先注意,您的构造函数不是(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。