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