对我来说,类与NodeJS(CommonJS)模块非常相似。你可以有很多,它们可以重复使用,它们可以互相使用,它们通常是每个文件一个。
是什么让模块与课程如此不同?您使用它们的方式不同,命名空间的区别很明显。除此之外,对我来说它们看起来非常相似,或者我在这里看不到明显的好处。
答案 0 :(得分:21)
模块更像是包(使用Java术语)而不是类。您没有实例化模块;它只有一个副本。它是用于组织相关功能的工具,但它通常不会封装对象的特定实例的数据。
可能最接近类的类似物(将实际构建基于类的继承的库放在一边)只是一个构造函数。您当然可以将这些功能放在模块中。
function Car() {
this.colour = 'red';
}
Car.prototype.getColour = function() { return this.colour; };
var myCar = new Car();
myCar.getColour(); // returns 'red'
您使用模块和类进行封装,但封装的性质不同。
答案 1 :(得分:2)
JS最初是一个原型继承系统。它像其他语言一样非常简单。但随后Netscape决定让它更像Java,并将构造函数的想法添加到语言中。因此伪类诞生了。 您可以查看此链接以了解JS中如何使用原型OOP: http://howtonode.org/prototypical-inheritance
答案 2 :(得分:0)
一件至关重要的事情; “通常每个文件一个”的事情不是真的;模块绝对是每个文件一个。将模块的require()
带入命名空间的exports
无法区分该模块的导出内容;模块(文件)导出的所有内容都使用require()
语句导入。尝试将多个模块放入文件只意味着当您尝试加载“任一”模块时,您将获得该文件中的所有内容。