Javascript 将参数传递给类构造函数
我已经编写了下面的模块,但是导入它并没有按预期工作。文件(为简单起见缩写):Javascript 将参数传递给类构造函数,javascript,node.js,Javascript,Node.js,我已经编写了下面的模块,但是导入它并没有按预期工作。文件(为简单起见缩写): templates.js 'use strict'; export default class Templates { constructor (args) { this.files = [{ name: `${args.name}.js`, path: 'src/', content: '' }];
templates.js
'use strict';
export default class Templates {
constructor (args) {
this.files = [{
name: `${args.name}.js`,
path: 'src/',
content: ''
}];
/* code omitted */
}
};
import Templates from './templates'
const opts = {name: 'app'};
/* code ommited */
console.log('Templates >>', typeof Templates);
console.log('Templates >>', new Templates());
let tmpls = new Templates(opts);
console.log(tmpls.files[0].name);
我试着这样使用它:
index.js
'use strict';
export default class Templates {
constructor (args) {
this.files = [{
name: `${args.name}.js`,
path: 'src/',
content: ''
}];
/* code omitted */
}
};
import Templates from './templates'
const opts = {name: 'app'};
/* code ommited */
console.log('Templates >>', typeof Templates);
console.log('Templates >>', new Templates());
let tmpls = new Templates(opts);
console.log(tmpls.files[0].name);
但我在控制台中得到以下错误跟踪
npm ERR! Linux 3.16.0-38-generic
npm ERR! argv "/home/wesleycoder/.nvm/versions/node/v5.1.0/bin/node" "/home/wesleycoder/.nvm/versions/node/v5.1.0/bin/npm" "init"
npm ERR! node v5.1.0
npm ERR! npm v3.3.12
npm ERR! Cannot read property 'name' of undefined
是的,这是一个~/.npm init
脚本,供可能会问的人使用
编辑:
感谢@low_ghost提供了有用的响应
我发现我的问题不在于导出和导入类。
它实际上是关于向这个类传递参数,而不是关于不传递参数。所以我把标题改成了简明
没有任何参数的console.log(new Templates())
在我的代码中是故意的。
我试图解决的错误是关于实例化对象和获取文件数组,但我直接从库中传递参数,而传递给此任务的参数“过份”了,因此,我简化了参数,从commander.js
中获取输入,并将属性中的每个参数分配到一个空对象中,然后沿着构造函数传递这个对象,这允许我获取readline sync
并从未传递的选项读取输入,使脚本更加出色,在这一切正常工作之后
如果commander.js
有任何选项可以在不增加库属性权重的情况下提供传递的选项,那就好了
Edit2:
毕竟,
commander.js
没有用,因为我无法将参数沿着npm init
命令传递给脚本本身。模板的构造函数将对象作为参数。如果您不传递它,args
参数是未定义的
,当您调用args.name
时,它将失败。试试这个:
console.log('Templates >>', new Templates({}));
或:
您还可以在构造函数中设置默认参数值,然后在不使用参数的情况下调用它:
constructor (args = {name: 'defaultName'}) {
//...
由于构造函数调用中缺少参数,名称未定义。根据意图,最好的解决方案是检查名称的存在和类型:
'use strict';
export default class Templates {
constructor (args) {
this.files = (args.name && typeof arg.name === "string")
? [{
name: `${args.name}.js`,
path: 'src/',
content: ''
}]
: [];
/* other code */
}
};
如果你对三元数没意见的话。如果arg.name不存在或不是字符串,则返回一个空数组作为This.files
编辑:
或者,正如madox2所建议的,提供一个默认值。虽然我会使用默认的名称,而不是整个args对象。比如:
constructor({ name = 'defaultName', ...otherArgs } = {})
这样,如果你打电话:
new Templates({ dir: 'repo' })
您仍然可以使用默认名称,如果您按字面理解省略号,则可以从otherArgs.dir获取dir。={}部分允许调用
new Templates()
并且仍然获取默认名称。
{name='defaultName',…otherArgs}
无效javascript@vkurchatkin:当然可以。查找解构。我的意思是…其他参数
part@vkurchatkin:我明白了。这是一个ES7提案,虽然可以在巴别塔中启用。ES7意味着它将成为2016规范版的一部分,但目前还不清楚。无论如何,除非问题是直接相关的,否则最好避免提出语法扩展。只是澄清一下:这个问题与Babel和ES6没有任何关系。