[英]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
為全局_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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.