我正在尝试通过在对象构造函数中的其他两个属性上运行函数来生成对象属性。
当我运行以下代码时:
var ConstObj = function() {
this.compositionDict = {
"rock": 0.8,
"iron": 0.15,
"gold": 0.05
};
this.totalVolume = 10000;
this.compVolDict = Object.keys(this.compositionDict).reduce(function(prev, curr) {
prev[curr] = this.compositionDict[curr] * this.totalVol;
return prev;
}, {});
}
var tempObj = new ConstObj;
我收到以下错误:
Uncaught TypeError: Cannot read property 'rock' of undefined(…)
我认为这不起作用,因为在运行函数时实际上没有定义对象属性 - 但我不知道我正在尝试做什么的好方法。
我可以创建一个在创建对象后添加新属性的函数,但似乎这种事情应该有效。
答案 0 :(得分:1)
this.compositionDict
在undefined
中reduce
,因为您的范围不同。
(function(prev, curr) {
)的那个
保存对ConstObj
函数范围的引用,然后使用该引用:
var ConstObj = function() {
var that = this; // Store the reference to `this`.
this.compositionDict = {
"rock": 0.8,
"iron": 0.15,
"gold": 0.05
};
this.totalVolume = 10000;
this.compVolDict = Object.keys(this.compositionDict).reduce(function(prev, curr) {
prev[curr] = that.compositionDict[curr] * that.totalVol;
return prev; // ^ use `that` instead of `this`
}, {});
}