动态属性值而不是函数?
问题描述:
是否可以给一个对象动态财产,或者说给一个对象的属性一动态值?例如:动态属性值而不是函数?
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更新中...
我希望你能帮助我:)
答
定义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);
答
除了干将,你可以使用一个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
你要找的ES5干将。但'.length'不是动态的;字符串是不可变的。 – SLaks
@SLaks提到,重要的是要注意'String#length'不是一个动态属性,因为字符串的内部值不能被改变。 – Phylogenesis
你的字符串示例不能证明你的观点。您正在创建另一个长度不同的新字符串。与你的对象相当的是:var obj = {c:21};的console.log(obj.c); obj = {c:42};的console.log(obj.c);'。看,'c'也改变了“动态”;) –