2016-11-23 48 views
0

我已經將我的代碼分解成了許多Typescript類和接口,雖然它運行良好,對測試和維護非常有用,但我想知道是否有更好的方法來構造所需的對象。據我所知,我的選擇是需要和建設,像這樣:模式或從所需模塊構造新對象的最佳方法?

const MyModule = require('./src/mymodule'); 
const myModule = new MyModule(); 

const myModule = new (require('./src/mymodule'))(); 

有另一種解決方案或者圖案作爲替代,可能使這個更具可讀性/乾淨?

回答

2

如果你需要一個給定的模塊中創建多個對象,那麼你會在那裏你模塊句柄保存到一個局部變量中使用自己的方案,先這樣,你可以多次引用它:

const SomeConstructor = require('./src/mymodule'); 

const myObj1 = new SomeConstructor(); 
const myObj2 = new SomeConstructor(); 

如果您只需要在給定模塊內創建一個該類型的對象,並且該模塊中不需要該模塊的其他任何輸出,如您所示,您不需要將構造函數/模塊句柄存儲在其自己的模塊中首先變量,所以你可以直接使用它,因爲你已經顯示:

const myObj = new (require('./src/mymodule'))(); 

因爲這個語法看起來有些尷尬,所以導出的工廠函數會自動爲您應用new。例如,http模塊暴露了一個工廠函數來創建一個服務器:

const http = require('http'); 
const server = http.createServer(...); 

在你的榜樣,你可以做的兩者之一:

// module constructor is a factory function for creating new objects 
const myObj = require('./src/mymodule')(); 

// module exports a factory function for creating new objects 
const myObj = require('./src/mymodule').createObj(); 

的一個例子Express服務器框架是這樣的:

const app = require('express')(); 

如果你想從Express模塊​​訪問其他出口:

const express = require('express'); 
const app = express(); 

app.use(express.static('public')); 

在快遞例子中,出口雙雙工廠功能,是在工廠功能性等方法。您可以選擇僅使用工廠功能(上面的第一個示例),或者您可以保存工廠功能,以便還可以訪問其中的一些屬性(第二個示例)。

+0

實際上'new require('./ src/mymodule')()'does * not * work。再次看看OP的用途。 – Bergi

+1

@Bergi - 我糾正了我的例子。使用'new'優先規則是JS中的噩夢(大多數人不知道它們)。另一個原因是不使用OP提出的方案,而是在沒有這種混淆的情況下使用工廠功能。 – jfriend00

+0

感謝您的詳細回覆!我剛剛閱讀了工廠解決方案。 (可能需要('./ src/mymodule'))(args); – Giallo

相關問題