2015-09-10 78 views
-2

我已經創建了一個require模塊,並且當'required'時,構造函數應該自動接受任何參數值,實例化所有變量和函數,並將該對象返回到調用所需模塊的文件。我可能沒有解釋它是正確的,所以這裏有一個例子:簡單的Javascript/NodeJS問題

var test = require('./testFramework'); //this works fine 
var socketIo = new require('./socketIoTests')(test); //<<this does not work 

在本月底,socketIo仍然是不確定的。

在socketIoTest.js文件module.exports被簡化爲:

var socketIo = function(testFramework){ 
    var test = testFramework 
    this.someArray = [...]; 

    this.testSockets = function(){...} 
} 

module.exports = socketIo; 

現在,你可以想像,因爲我是創建一個對象,可以做到以下幾點,它的工作原理完全我期待:

var test = require('./testFramework'); 
var socketIo = require('./socketIoTests'); 

var newObj = new socketIo(test); //<<this works 

這裏的變量newObj,返回與對象和公共屬性我想到,卻是有沒有辦法切斷這一步出的東西,如:

var socketIo = new require('./socketIoTests')(test); 

我懷疑這要麼是非常直接的,我需要更好地學習JavaScript,否則這是不可能的。

回答

0
var socketIo = new (require('./socketIoTests'))(test); 

應該只是罰款。

您的socketIo函數不是構造函數。這只是一個功能。要使其用作構造函數,您需要使用new。如果你想避免使用new,你可以簡單地在函數中創建一個對象,將所有屬性附加到該對象而不是this並返回該對象。

var socketIo = function(testFramework){ 
    var test = testFramework; 
    var socketIoObject = {}; 
    socketIoObject.someArray = [...]; 

    socketIoObject.testSockets = function(){...} 

    return socketIoObject; 
} 

module.exports = socketIo; 
+0

謝謝!即時通訊將選擇頂級的解決方案,所以我可以在對象上工作,就好像它是一個普通的JS對象,而不必創建額外的變量。 – X0r0N

1

你可以讓你的module.exports成爲一個函數,所以你可以做require('./socketIoTests')(test);類的事情。

讓你的模塊遵循

module.exports = function (theParam) { 

    // Do something with the param ... 
    // var yourDesiredValue = ... 

    return yourDesiredValue; 
} 
+0

謝謝。這當然有效,但有更多的功能+變量需要添加公共/私人,所以我要去的解決方案:var socketIo = new(require('./ socketIoTests'))(test);所以我可以把它作爲一個普通的JS對象來管理,而不必處理變量的開銷。你的解決方案非常棒,但對我的解決方案來說不是必需的 – X0r0N