[英]How to create an object with a property that is the sum of other properties in the same object in Javascript
我對此有很多麻煩,似乎無法在任何地方找到正確的答案。 我正在創建一個具有各種屬性的對象A,其中一個屬性是另兩個屬性的和,如下所示:
var A = {
a:0,
b:0,
c: this.a + this.b
};
問題出在哪里,當我引用Ac時,在運行時得到的是NaN而不是0,或者它應基於我分配給a和b的任何值。
請他; p。 我很困惑。
因為歷境this
不是對象的引用A
,而是封閉范圍的基准,即, window
。
因此, this.a + this.b
-->
undefined + undefined
-->
NaN
。
用於說明封閉范圍的示例(在本例中為object window
):
var a = 5; var b = 5; var A = { a: 0, b: 2, c: this.a + this.b }; console.log(Ac);
一種替代方法是使用getter
將函數綁定到該屬性c
。
var A = { a: 0, b: 2, get c() { return this.a + this.b } }; console.log(Ac); Aa = 33; console.log(Ac);
將A的c值(Ac)包裝成這樣的函數:
var A = {
a:9,
b:2,
c:function() {
return this.a + this.b
}
};
console.log(A.c());
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.