如何使用属性创建对象,该属性是Javascript中同一对象中其他属性的总和

时间:2018-04-02 00:38:06

标签: javascript nativescript

我遇到了很多麻烦,似乎无法在任何地方找到正确的答案。我正在创建一个具有各种属性的对象A,其中一个属性是另外两个属性的总和,如下所示:

    var A = {
       a:0,
       b:0,
       c: this.a + this.b
    };

我的问题出现在运行时,当我引用A.c时,我得到的是NaN而不是0,或者根据我分配给a和b的值得到的任何值。

请他; p。我完全糊涂了。

3 个答案:

答案 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