当前位置:  开发笔记 > 编程语言 > 正文

将参数传递给类构造函数

如何解决《将参数传递给类构造函数》经验,为你挑选了1个好方法。

我已经编写了以下模块,但是导入它无法按预期方式进行。文件(为简化起见缩写):

templates.js

'use strict';

export default class Templates {
    constructor (args) {
        this.files = [{
            name: `${args.name}.js`,
            path: 'src/',
            content: ''
        }];
        /* code omitted */
    }
};

我正在尝试像这样使用它:

index.js

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库中传递了参数,并且传递的参数对于该任务来说是“过度杀伤力”,因此我通过采用输入来简化参数从commander.js一个空对象中的一个属性中分配每个对象,然后将其分配给一个空对象,然后将该对象沿构造函数传递,这使我可以readline-sync从未传递的选项中读取输入,并使脚本更加出色,在此之后一切正常。

如果commander.js有任何选项可以传递选项,而又不增加库属性的重量,那会很好。

对于那些感兴趣的人,该项目在github上。您可以分叉,进行自己的变形和共享,我发现使用~/.npm-init有助于启动需要更特定环境的项目。

Edit2: 毕竟commander.js没有用,因为我无法将参数沿npm init命令传递给它自己的脚本。



1> low_ghost..:

由于构造函数调用中缺少参数,因此名称未定义。最好的解决方案,根据意图,将是检查名称的存在和类型:

 '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()

仍获得默认名称。

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有