簡體   English   中英

與閉包共享構造函數參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM