JavaScript类:构造函数中定义的成员未定义?
我有一个名为UrlBuilder的类,它遍历.json文件,然后构建URL。我可以遍历数据并打印正确的输出,但是当我尝试将其推送到类构造函数中定义的数组时,我被告知该数组未定义 这是我的密码: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 = []; }
"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);
}
}