我遇到了很多麻烦,似乎无法在任何地方找到正确的答案。我正在创建一个具有各种属性的对象A,其中一个属性是另外两个属性的总和,如下所示:
var A = {
a:0,
b:0,
c: this.a + this.b
};
我的问题出现在运行时,当我引用A.c时,我得到的是NaN而不是0,或者根据我分配给a和b的值得到的任何值。
请他; p。我完全糊涂了。
答案 0 :(得分:2)
因为上下文this
不是对象A
的引用,而是引用
封闭范围,即window
。
所以,this.a + this.b
-->
undefined + undefined
-->
NaN
。
用于说明封闭范围(在本例中为对象window
)的示例:
var a = 5;
var b = 5;
var A = {
a: 0,
b: 2,
c: this.a + this.b
};
console.log(A.c);

另一种方法是使用 getter
将函数绑定到该属性c
。
var A = {
a: 0,
b: 2,
get c() {
return this.a + this.b
}
};
console.log(A.c);
A.a = 33;
console.log(A.c);

答案 1 :(得分:0)
将A的值(A.c)包装成如下函数:
var A = {
a:9,
b:2,
c:function() {
return this.a + this.b
}
};
console.log(A.c());
答案 2 :(得分:0)
var obj = {
evtChange: function (v) { /* event on any (a, b) changes */
console.log("property changed >> " + v)
},
_a: 70,
_b: 80,
set a(v) {
if (v !== this._a) { /* to prevent unwanted recalculation for complexe calcul statements */
this._a = v;
this.c = this._a + this._b;
this.evtChange(this.c);
}
},
get a() {
return this._a;
},
set b(v) {
if (v !== this._b) { /* to prevent unwanted recalculation for complexe calcul statements */
this._b = v;
this.c = this._a + this._b
this.evtChange(this.c);
}
},
get b() {
return this._b;
},
/* using getter memo
** if we call obj.c first, getter methode will be replaced with a property.
** getter methode will be replaced too on any setters (a, b) call
*/
get c() {
delete this.c; // delete getter
return this.c = this._a + this._b // replace getter imediately with c property
}
};
console.log(obj);
console.log(obj.c);
console.log(obj);
obj.a = 500;
obj.b = 2000;
console.log(obj.c);
控制台输出:
/*obj*/
{evtChange: ƒ, _a: 70, _b: 80}
/*obj.c*/
150
/*obj*/
{evtChange: ƒ, _a: 70, _b: 80, c: 150}
/*obj.a = 500*/
property changed >> 580
/*obj.b = 2000;*/
property changed >> 2500
/*obj.c*/
2500