模块导出ECMA6类的最佳实践

时间:2017-08-10 06:44:33

标签: javascript node.js module ecmascript-6

在我的nodejs项目中广泛使用ECMA 6类,我的问题是关于导出这些类。 例如,有两种方式:

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的类级别属性(在这种情况下为Db)不会重复。

第二种方法实例化MyClass,但是在调用SomeMethod时创建变量DB的次数。

第三种方法不那么简洁,就是为DB创建全局变量并使用它:

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

我想知道什么方法更合适,在什么情况下。

最佳, -V

1 个答案:

答案 0 :(得分:2)

您的第一个方法是导出该类,并允许任何加载您的模块的人根据需要创建任意数量的对象实例。

您的第二种方法只导出一个对象,无论有多少单独的调用者都加载您的模块。这称为单例,此模块的所有客户将共享同一个对象。

您的第三种方法在实际使用方面与第二种方法没有太大区别。它也是一个单例,因为所有调用者都可以访问同一个对象。您的变量DB不是全局变量。它是一个模块级变量,只能访问此模块中的代码。第三种方法的优点是DB变量不能被外部代码搞砸,而在第一种方法中,数据存储在对象的实例数据中,任何人都可以访问。

前两个选项提供了非常不同的功能(自由创建许多对象与单身)。您必须决定是否要导出类,以便其他人可以创建自己的实例,或者是否只想导出单个对象,并且所有调用者共享同一个对象。这是您的架构选择,我们无法为您制作,因为它仅取决于您要导出的内容以及您希望此模块的客户拥有的功能。有理由希望模块的所有用户共享同一个对象,并且每个用户都有理由能够实例化他们自己的对象。你必须决定你想要的。