JavaScript类:构造函数中定义的成员未定义?

时间:2018-01-16 22:00:57

标签: javascript node.js class ecmascript-6

我有一个名为UrlBuilder的类,它遍历.json文件然后构建URL。我可以到达循环数据并打印正确的输出,但当我尝试将其推送到类构造函数中定义的数组时,我被告知数组是未定义的。

这是我的代码:

"use strict";
const DATA = require("../resources/data.json").services;

class UrlBuilder {

    constructor() {
        this.serviceArr = [];
    }

    static _iterateAndBuild(current_val, index, array) {
        for(let path of current_val.paths) {
            let url = current_val.baseURL + Object.values(path);
            this.serviceArr.push(url);
        }

        let recHistUrl = current_val.server + current_val.recordHistoryUrl;
        serviceArr.push(recHistUrl);

        console.log("Pushing this value to array: " + recHistUrl);
    }

    buildServiceArr() {
        DATA.forEach(UrlBuilder._iterateAndBuild);
    }

}

module.exports = UrlBuilder;

正如您所看到的,我打破了forEach的回调函数。因此,当我调用UrlBuilder.buildServiceArr时,它会遍历DATA对象并执行上面写的回调。

这是输出:

  

C:\用户\ payton.juneau \桌面\我\项目\节点\ com.etouchmenu.serviceSpyGlass>节点   app.js   C:\ Users \用户payton.juneau \桌面\我\项目\节点\ com.etouchmenu.serviceSpyGlass \公用事业\ urlBuilder.js:13               this.serviceArr.push(URL);                    ^ TypeError:无法读取未定义的属性'serviceArr'       在_iterateAndBuild(C:\ Users \ payton.juneau \ Desktop \ Me \ Projects \ Node \ com.etouchmenu.serviceSpyGlass \ utilities \ urlBuilder.js:13:18)       在Array.forEach()       在UrlBuilder.buildServiceArr(C:\ Users \ payton.juneau \ Desktop \ Me \ Projects \ Node \ com.etouchmenu.serviceSpyGlass \ utilities \ urlBuilder.js:23:14)       在对象。 (C:\ Users \用户payton.juneau \桌面\我\项目\节点\ com.etouchmenu.serviceSpyGlass \ app.js:10:12)       在Module._compile(module.js:660:30)       at Object.Module._extensions..js(module.js:671:10)       在Module.load(module.js:573:32)       在tryModuleLoad(module.js:513:12)       在Function.Module._load(module.js:505:3)       在Function.Module.runMain(module.js:701:10)

感谢您提前的时间!可能像范围一样愚蠢。

2 个答案:

答案 0 :(得分:3)

DATA.forEach(UrlBuilder._iterateAndBuild);

应该是

DATA.forEach(UrlBuilder._iterateAndBuild, this);

this buildServiceArr作为this的{​​{1}}传递。

作为一般风格评论,如果你有一个不应该作为静态公开的函数,只需把它放在课后,例如

_iterateAndBuild

虽然对于你的情况,我不确定它为什么是静态的而不是实例方法,例如

class UrlBuilder {
    // ...

    buildServiceArr() {
        DATA.forEach(iterateAndBuild);
    }
}

function iterateAndBuild(current_val, index, array) {
    // ...
}

这将更符合你的目标。

答案 1 :(得分:0)

您应该可以使用

进入阵列
 this.serviceArr.push(recHistUrl);