Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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_Class_Ecmascript 6 - Fatal编程技术网

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

JavaScript类:构造函数中定义的成员未定义?,javascript,node.js,class,ecmascript-6,Javascript,Node.js,Class,Ecmascript 6,我有一个名为UrlBuilder的类,它遍历.json文件,然后构建URL。我可以遍历数据并打印正确的输出,但是当我尝试将其推送到类构造函数中定义的数组时,我被告知该数组未定义 这是我的密码: "use strict"; const DATA = require("../resources/data.json").services; class UrlBuilder { constructor() { this.serviceArr = []; }

我有一个名为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
时,它循环遍历数据对象并执行写在上面的回调

以下是输出:

C:\Users\payton.juneau\Desktop\Me\Projects\Node\com.etouchmenu.serviceSpyGlass>Node app.js C:\Users\payton.juneau\Desktop\Me\Projects\Node\com.etouchmenu.serviceSpyGlass\utilities\urlBuilder.js:13 此.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\Desktop\Me\Projects\Node\com.etouchmenu.serviceSpyGlass\app.js:10:12) 在模块处编译(Module.js:660:30) 在Object.Module.\u extensions..js(Module.js:671:10) 在Module.load(Module.js:573:32) 在tryModuleLoad时(module.js:513:12) 在Function.Module.\u加载(Module.js:505:3) 位于Function.Module.runMain(Module.js:701:10)


提前感谢您的时间!可能是一些愚蠢的事情,比如作用域。

您应该能够通过使用

 this.serviceArr.push(recHistUrl);
应该是

DATA.forEach(UrlBuilder._iterateAndBuild, this);
因此,来自
buildServiceArr
this
作为
\u iterateAndBuild
this
传递

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

class UrlBuilder {
    // ...

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

function iterateAndBuild(current_val, index, array) {
    // ...
}
虽然对于您的情况,我不确定为什么它是静态的而不是实例方法,例如

class UrlBuilder {
    // ...
    _iterateAndBuild(current_val, index, array) {
      // ...
    }

    buildServiceArr() {
        DATA.forEach(this._iterateAndBuild, this);
    }
}

这将更符合您正在尝试执行的操作。

或者将整个操作作为箭头函数传递给
forEach
,或者简单地将其放入
for(const currentVal of DATA){…}
循环的主体中。您好!这解决了我的问题。我不完全确定“上下文”参数的含义,但现在它有了完美的意义。另外,感谢您对编写我的代码的约定的评论。这是我强调的一点,因为我总是试图以一种公认的标准来组织我的代码。我非常感谢你对我的问题的了解!
class UrlBuilder {
    // ...
    _iterateAndBuild(current_val, index, array) {
      // ...
    }

    buildServiceArr() {
        DATA.forEach(this._iterateAndBuild, this);
    }
}