node.js - 模块 vs 类 vs 对象字面量
问题描述
这是特定于 nodejs 的。
什么时候最好使用模块、类或对象字面量?
一个模块看起来像这样:
//myModule.js
module.exports = {
function func1() {
console.log("func1");
}
function func2() {
console.log("func2");
}
}
//in another js file
const myModule = require('myModule');
myModule.func1();
myModule.func2();
这个类看起来像这样。我们也可以用 javascript 原型的方式来做这件事,但是为了简单起见在这里做。
//myClass.js
class myClass {
func1() {
console.log("Func1");
}
func2() {
console.log("Func2");
}
}
module.exports = myClass;
//in another js file
const myClass = require('myClass');
let newClass = new myClass();
newClass.func1();
newClass.func2();
最后,我们可以有一个对象字面量单例。
//myObj.js
let myObj = {
func1: function() {
console.log("Func1");
},
func2: function() {
console.log("Func2");
}
};
module.exports = myObj;
//in another js file
let myObj = require('myObj');
myObj.func1();
myObj.func2();
类和对象字面量的区别在于对象字面量充当单例;而类可以有多个实例。
但是对象文字和模块示例之间的区别呢?这些是完全相同的模式吗?
解决方案
但是对象文字和模块示例之间的区别呢?这些是完全相同的模式吗?
当一个类有可能被正确地用作一个类时,应该使用一个类(例如,如果你想在一个实例上放置或检索数据,而该实例也有方法,那么一个类就非常有意义)。
// MyClass.js
class MyClass {
func1() {
console.log("Func1");
}
func2() {
console.log("Func2");
}
setData(data) {
this.data = data;
}
getData() {
return this.data;
}
}
const instance = new MyClass();
instance.setData('foo');
console.log(instance.getData());
但是,如果像这种情况一样,您只想将相似的函数收集在一起,那么类会使代码更加混乱,而没有真正的好处。代码的读者(可能包括你自己,在后面的某个地方)会期望一个类用于普通对象不能做的事情。
您与您myModule.js
的几乎相同myObj.js
- 两者都在导出一个具有某些属性的普通对象。唯一的区别是中间变量的存在,myObj
除了作为中间变量之外不使用。
当您想要可靠地引用导出对象的其他属性时,在导出之前在独立变量中定义要导出的对象会有所帮助:
// a little bit verbose, have to reference `module.exports` every time
// to get to the exported object:
module.exports = {
getSummary() {
// using "this" instead may not be reliable without a `bind`
const { summary } = module.exports.getAllInfo();
return summary;
}
getAllInfo() {
// ...
}
};
// a little bit more DRY:
const obj = {
getSummary() {
const { summary } = obj.getAllInfo();
return summary;
}
getAllInfo() {
// ...
}
};
module.exports = obj;
您也可能(或可能不)考虑将要在独立变量中导出的对象定义为更具可读性。您可以使用任何适合您用例的东西。
推荐阅读
- javascript - React-Bootstrap-Table-Next 对动态表上的字母数字字符串进行排序
- openssh - 对于 SSH 证书,是否可以知道服务器端的嵌入式命令?
- c - 从终端通过管道传输到 C 程序的文件中获取信息
- java - Java无法找到启动画面的图像
- python - 如何从另一个文件运行 python 文件,然后让新文件重新启动第一个文件?
- android - Flutter Audioplayers 无法加载资产
- javascript - 动态添加嵌套对象,分配给定值并使用具有键值对的对象添加更多对象
- node.js - 在 BrowserStack 上禁用 IE11 的 XSS 过滤器
- ubuntu - 公开会议 + Kurento。视频和音频不起作用
- google-sheets - 按周对时间表记录的小时数进行排序