2017-08-10 47 views
1

在我廣泛使用ECMA 6類的nodejs項目中,我的問題是關於導出此類的問題。 有2種方式,例如:ECMA6類的模塊出口最佳實踐

class MyClass{ 
    constructor(myAttr){this._DB =DB;} 
    someMethod(){DB.save()} 
} 
module.exports=Myclass; 

方式二:

class MyClass{ 
    constructor(){} 
    someMethod(obj){var DB =require('DB'); DB.save(obj)} 
} 
module.exports=new Myclass(); 

第一個依靠的.js實例化的類和傳遞變量(DB)在對象創建的MyClass,然而,隨着許多請求進入MyClass,將創建儘可能多的對象。但是,MyClass的Class級別屬性(本例中爲Db)不會被重複。

第二種方法實例化MyClass,但創建變量DB的次數與調用SomeMethod的次數相同。

第三種方法不是那麼整齊是爲DB創建全局變量和使用它:

'use strict' 
const DB = require('DB')  
class MyClass{ 
    constructor(){} 
    someMethod(obj){DB.save(obj)} 
} 
module.exports=new Myclass(); 

我想知道哪種方法更適合在什麼情況下。

最佳, -V

+0

第二種和第三種方法是單例,很容易導致新的全局可變狀態,這是不好的。 – Ryan

+0

可以請您詳細說明一下! – vaibhav

+0

@vaibhav單身人士傾向於充當全局變量,即將全局狀態引入您的應用程序。由於默認情況下Javascript中的Object是可變的,所以這個全局狀態可能是可變的。 – ftor

回答

3

你的第一種方法導出類和允許任何人誰給你的模塊來創建對象的多個實例,因爲他們想。

您的第二種方法只導出一個對象,無論有多少個獨立的調用者都加載您的模塊。這被稱爲單例,並且該模塊的所有客戶將共享相同的單個對象。

第三種方法與第二種方法在實際使用方面沒有多大區別。這也是一個單身人士,所有的呼叫者都可以訪問同一個對象。您的變量DB不是全球性的。這是一個模塊級別的變量,只能通過該模塊中的代碼訪問。第三種方法的優點是DB變量不能與外部代碼混淆,而在第一種方法中,該數據存儲在對象的實例數據中,任何人都可以訪問。

前兩個選項提供了非常不同的功能(自由地創建許多對象與單件)。您必須決定是否要導出該類,以便其他人可以創建自己的實例,或者只想導出單個對象,並且所有調用者都共享同一個對象。這是您的建築選擇,我們無法爲您提供,因爲它僅取決於您想要導出的內容以及您希望此模塊的客戶擁有哪些功能。有理由希望模塊的所有用戶共享同一個對象,並且每個用戶都有能夠實例化他們自己的對象的理由。你必須決定你想要什麼。

+0

@vaibhav - 這是否回答你的問題?如果是這樣,您可以通過點擊答案左側的綠色複選標記來向社區表明這一點,這也會爲您贏得一些聲望點。 – jfriend00