2017-01-09 80 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