与闭包共享构造函数参数
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。
我想了解为什么其中一个版本有效而另一个版本无效。为什么进行 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。