2017-04-05 38 views
0

我正在學習在NodeJS(7.7.3)中使用ECMAScript6風格的類。我用這樣的編程風格:在Nodejs中傳遞參數低谷需求模塊到ES6類

//app.js 
 
var forecastHandler = require('./forecastHandler.js'); 
 

 
//forecastHandler.js 
 
class ForecastHandler { 
 
    constructor() {} 
 
} 
 

 
module.exports = new ForecastHandler()

它一直行之有效到現在,是因爲我要傳遞參數給模塊。

//app.js 
 
var forecastHandler = require('./forecastHandler.js')(3600); 
 

 
//forecastHandler.js 
 
class ForecastHandler { 
 
    constructor(cacheUpdateDelay) {} 
 
} 
 

 
module.exports = new ForecastHandler(cacheUpdateDelay)

我得到這個錯誤:不定義cacheUpdateDelay:引發ReferenceError。 我可以使用ES6風格的類將參數傳遞給ForecastHandler模​​塊並在module.exports上創建對象嗎?如果我只導出類並在app.js中創建對象,則代碼有效,但它的語法很醜陋。

//app.js 
 
var forecastHandlerClass = require('./forecastHandler.js'); 
 
var forecastHandler = new forecastHandlerClass(3600); 
 

 
//forecastHandler.js 
 
module.exports = ForecastHandler

編輯:更好的例子

回答

1
module.exports = new ForecastHandler(cacheUpdateDelay) 

與此代碼的麻煩是,它初始化該對象時的代碼是第一次運行。

require('./forecastHandler.js')的意思是「forecastHandler.js執行所有的代碼,並給我exports對象。這意味着JS引擎嘗試運行new ForecastHandler(cacheUpdateDelay)時,有沒有創造cacheUpdateDelay

簡單的方式做,這是一個您提供的加載類,然後嘗試做它的一個新的實例。如果你真的要單行,你可以在app.js做到這一點:。

var forecastHandler = new (require('./forecastHandler.js'))(3600); 

還有其他各種娃你可以做到這一點。最簡單的不涉及導出類,而是一個函數。

舉例來說,你可以在你的模塊文件做到這一點:

module.exports = cacheUpdateDelay => new ForecastHandler(cacheUpdateDelay); 
// OR 
module.exports = function(cacheUpdateDelay) { 
    return new ForecastHandler(cacheUpdateDelay); 
}; 
+0

謝謝你,這個工程。我太癡迷單線運動了。 – jartza

+0

你的包裹在'require'周圍的地方是錯誤的。這會調用'require'本身作爲構造函數,然後將模塊導出放回原位,然後將模塊導出作爲普通函數調用,而不使用'new'。 – loganfsmyth

+0

@loganfsmyth的確,感謝您發現這一點。這當然是我想要的代碼。雖然我會主張或使用*代碼*。 – lonesomeday