2016-12-15 25 views
1

我正在研究Javascript的面向對象功能,我正在研究「模塊模式」。我有一個自我執行的功能,我想從另一個文件調用,但我不斷收到錯誤。如何從另一個文件調用自執行功能

這裏的自我執行模塊:

var basketModule = (function() { 
    var basket = []; 
    function doSomethingPrivate() { 
     //... 
    } 
    // Return an object exposed to the public 
    return { 
     // Add items to our basket 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     // Get the count of items in the basket 
     getItemCount: function() { 
      return basket.length; 
     }, 
    }; 
})(); 

我試圖用這個從叫Run.js另一個文件:

var basketModule = require("./basketModule"); 

basketModule.addItem({ 
    item: "bread", 
    price: 0.5 
}); 
console.log(basketModule.getItemCount()); 

當我運行這個node Run.js我得到一個錯誤:

basketModule.addItem is not a function.

我嘗試添加一個調用basketModule像這樣:basketModule();後立即要求,但這樣的結果

TypeError: basketModule is not a function.

我錯過了什麼?

console.log(basketModule.getItemCount()); 
+1

你需要導出你的代碼:'module.exports = basketModule'。查看https://nodejs.org/api/modules.html#modules_module_exports –

+0

在您的代碼中,'basketModule'不能由匿名函數定義。 – nmnsud

回答

3

您需要導出模塊課前可以通過調用需要的功能之後添加module.exports = basketModule;使用它。

var basketModule = (function() { 

var basket = []; 
function doSomethingPrivate() { 
    //... 
} 

// Return an object exposed to the public 
return { 

    // Add items to our basket 
    addItem: function(values) { 
     basket.push(values); 
    }, 

    // Get the count of items in the basket 
    getItemCount: function() { 
     return basket.length; 
    }, 


}; 
})(); 


module.exports = basketModule; 

而且在以上我已經創建了basketModule的新實例,然後你的其他文件

var basketModule = require("./src/basketModule.js"); 

basketModule.addItem({ 
    item: "bread", 
    price: 0.5 
}); 

console.log(basketModule.getItemCount()); 

上叫.addItem()

+0

添加'module.exports = basketModule'擺脫了錯誤,但試圖使用'basketModule'導致'basketModule不是函數'。你回答了我的問題,所以我會接受答案,但我很想知道爲什麼新的錯誤正在發生。 – Eddy

+0

您可能還需要在您的末尾加入'.js'只需要注意即可。快速重塑您的榜樣並進行測試! –

+0

@Eddy我完全第二次猜測我自己在我的答案中的編輯,我會更新它,雖然在測試工作。 –