我一直在做一些有趣的练习"升级你的编码" site,Exercism.io,他们使用CommonJS样式模块作为代码示例并使用Jasmine进行测试。我一直认为模块是一个我不想处理的麻烦,但在这些一口大小的块中,看起来它们在我的单页应用程序中开始使用会非常有用。因此,我一直在谷歌搜索并搜索Github使用CommonJS模块的一些好样本 - 但仍然没有找到一个详细解释主要模式是什么,以及它们如何不同的样本。例如,我提交的一个答案如下:
var HelloWorld = function () {};
HelloWorld.prototype.hello = function () {
return 'Hello, World!'
};
module.exports = HelloWorld;
但另一个看起来像这样
var Bob = function () {
this.hey = function (input) {
input = input.split('');
if (input.indexOf('!') >= 0) {return 'Whoa, chill out!'}
if (input.indexOf('?') >= 0) {return 'Sure.'}
return 'Whatever.'
};
}
module.exports = Bob;
具体来说,我想知道在父定义中嵌套一个函数与Bob hey()函数之间的区别是什么,而不是HelloWorld hello()使用 prototype <的方式/ strong>相反。
答案 0 :(得分:2)
首先,您提供的两个函数作为示例彼此完全不同,并且具有不同的用途。
根据您所拥有的代码,您调用它们的方式也不正确。
对于您的Bob示例,您所做的只是为变量分配函数。要调用它,您只需执行Bob()
。如果您执行Bob.hello()
,则会收到错误。
另一方面,HelloWorld不仅仅是一个函数,嗯..因为你声明它是一个空函数,如果你HelloWorld()
它会调用它。但是你定义了hello
作为它的原型函数,你可以直接调用它,你必须做HelloWorld.prototype.hello()。我认为这些主要用于改变现有对象或函数的行为。
你在问什么是最有效的编写模块的方法,但实际上并没有正确的答案。所有模块都是一段代码,可以被其他文件导出和重用。无论你喜欢什么,它们都可以是函数,对象,简单变量!
所以基本上你可以做所有这些:
// moduleThatExportsANumber.js
module.exports = 1
// moduleThatExportsAnObject.js
module.exports = {}
// moduleThatExportsAFunction.js
module.exports = function () { return 'say somethign!'}
// main.js Lets call all the modules!
const number = require('./moduleThatExportsANumber)
const object = require('./moduleThatExportsAnObject)
const function = require('./moduleThatExportsAFunction)
console.log(number) // 1
console.log(object) // {}
console.log(function) // function () { return 'say somethign!'}
console.log(function()) //say somethign!
关于模块的全部内容只是简单地将文件写入文件,导出那些东西,在CommonJS的情况下通过module.exports = [whatever you are exporting]
完成,然后导入,对于CommonJS是require('./filename')
现在......回到原来的问题,你的备忘单。不幸的是,我不知道任何CommonJS,here是一篇关于CommonJS模块系统的博客文章,here是一个你可能喜欢的JavaScript版本。