簡體   English   中英

如何創建一個對象,該對象的屬性是Javascript中同一對象中其他屬性的總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM