Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将参数传递给类构造函数_Javascript_Node.js - Fatal编程技术网

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没有任何关系。