动态属性值而不是函数?

4

是否可以给一个对象赋予一个动态属性,或者说给一个对象属性赋予一个动态的值?例如:

var obj = {
    a: 0,
    b: 5,
    c: //should always be a+b
}

显然,我可以使用一个方法c=function(){return a+b},但这样我就必须总是使用括号来调用c作为一个方法(obj.c()而不是obj.c)。虽然这不会真正成为问题,但我相信它必须以某种方式工作,因为内置的length属性也是一个属性而不是一个函数。这个属性随着对象而动态地改变,并不是一个函数...

var str = "hello world";
console.log(str.length); //11
str = "hello stack overflow";
console.log(str.length); //20

属性值在没有更新的情况下发生了变化...
希望可以帮助您 :)

2
你正在寻找ES5 getter。但是.length不是动态的,字符串是不可变的。 - SLaks
正如@SLaks所指出的那样,需要注意的是String#length不是一个动态属性,因为字符串的内部值是不可更改的。 - Phylogenesis
1
你的字符串示例并不能证明你的观点。你正在创建一个长度不同的第二个新字符串。使用对象的等效方式是:var obj = {c: 21}; console.log(obj.c); obj = {c: 42}; console.log(obj.c);。看,c也被“动态”地改变了 ;) - Felix Kling
3个回答

4

在创建对象时定义getter,或使用Object#defineProperty稍后添加:

var obj = {
  a: 0,
  b: 5,
  get c() { // assign it at object creation
    return this.a + this.b;
  }
};

console.log(obj.c);

// add it to existing object
Object.defineProperty(obj, 'd', {
  get: function() {
    return this.a + this.b + this.c;
  }
});


console.log(obj.d);


1

除了getter,你还可以使用ES6的一个特性,Proxy

Proxy对象用于为基本操作(如属性查找、赋值、枚举、函数调用等)定义自定义行为。

var obj = {
        a: 0,
        b: 5,
    },
    p = new Proxy(obj, {
        get: function(target, prop) {
            return prop === 'c' ? target.a + target.b : target[prop];
        }
    });
   
console.log(p.c); // 5


0

你可以使用一个getter

var o = {
   a : 0; 
   b : 1;
   get c () {return this.a + this.b;}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接