首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript类:未定义的构造器中定义的成员?

JavaScript类:未定义的构造器中定义的成员?
EN

Stack Overflow用户
提问于 2018-01-16 22:00:57
回答 2查看 234关注 0票数 1

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

这是我的代码:

代码语言:javascript
复制
"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 this.serviceArr.push(url);^ TypeError:无法读取未定义at _iterateAndBuild、at _iterateAndBuild at Array.forEach () at UrlBuilder.buildServiceArr (C:\Users\payton.juneau\Desktop\Me\Projects\Node\com.etouchmenu.serviceSpyGlass\utilities\urlBuilder.js:23:14) at Object的属性“serviceArr”。(C:\Users\payton.juneau\Desktop\Me\Projects\Node\com.etouchmenu.serviceSpyGlass\app.js:10:12) at Module._compile (module.js:660:30) at Object.Module._extensions..js (module.js:671:10) at Module.load (module.js:573:32) at tryModuleLoad (module.js:513:12) at Function.Module._load (module.js:505:3)在Function.Module.runMain (module.js:701:10)

谢谢你提前给我时间!可能是像范围调查之类的傻事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-16 22:35:36

代码语言:javascript
复制
DATA.forEach(UrlBuilder._iterateAndBuild);

应该是

代码语言:javascript
复制
DATA.forEach(UrlBuilder._iterateAndBuild, this);

因此,来自buildServiceArrbuildServiceArr被传递为this of _iterateAndBuild

作为一个一般的文体评论,如果你有一个函数不应该是静态的,就把它放在类的后面。

代码语言:javascript
复制
class UrlBuilder {
    // ...

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

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

虽然对于您的情况,我不知道为什么它是静态的,而不是一个实例的方法。

代码语言:javascript
复制
class UrlBuilder {
    // ...
    _iterateAndBuild(current_val, index, array) {
      // ...
    }

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

这会更符合你想做的事情。

票数 2
EN

Stack Overflow用户

发布于 2018-01-16 22:04:10

您应该能够通过使用

代码语言:javascript
复制
 this.serviceArr.push(recHistUrl);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48290528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档