2017-01-09 82 views
3

是否可以给一个对象动态财产,或者说给一个对象的属性一动态?例如:动态属性值而不是函数?

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 

没有它的属性值更改beeing更新中...

我希望你能帮助我:)

+2

你要找的ES5干将。但'.length'不是动态的;字符串是不可变的。 – SLaks

+0

@SLaks提到,重要的是要注意'String#length'不是一个动态属性,因为字符串的内部值不能被改变。 – Phylogenesis

+1

你的字符串示例不能证明你的观点。您正在创建另一个长度不同的新字符串。与你的对象相当的是:var obj = {c:21};的console.log(obj.c); obj = {c:42};的console.log(obj.c);'。看,'c'也改变了“动态”;) –

回答

3

定义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);

0

您可以使用getter

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

} 
1

除了干将,你可以使用一个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