模块导出ECMA6类的最佳实践

在我的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来实例化类并传递variables(DB)。虽然在创buildMyClass的对象时,会有尽可能多的对象创build,因为MyClass中有许多请求正在进入。 然而,MyClass的Class级别属性(在这种情况下是Db)不会被重复。

第二种方法实例化MyClass,但创buildvariablesDB的次数与调用SomeMethod的次数相同。

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

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

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

最好的-V

你的第一种方法是导出类,并允许加载你的模块的任何人创build你想要的对象的实例。

你的第二种方法只导出一个对象,不pipe有多less个独立的调用者都加载你的模块。 这被称为单例,并且该模块的所有客户将共享相同的单个对象。

第三种方法与第二种方法在实际使用方面没有多大区别。 这也是一个单身人士,所有的呼叫者都可以访问同一个对象。 你的variablesDB不是全局的。 这是一个模块级别的variables,只能被这个模块中的代码访问。 第三种方法的优点是DBvariables不能被外部代码搞乱,而在第一种方法中,数据存储在对象的实例数据中,并且可以被任何人访问。

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