Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态属性值而不是函数?_Javascript_Object_Methods_Dynamic_Properties - Fatal编程技术网

Javascript 动态属性值而不是函数?

Javascript 动态属性值而不是函数?,javascript,object,methods,dynamic,properties,Javascript,Object,Methods,Dynamic,Properties,是否可以为对象指定动态属性,或者更确切地说,为对象属性指定动态值?例如: var obj = { a: 0, b: 5, c: //should always be a+b } 显然,我可以使用方法c=function(){returna+b},但是我总是需要使用大括号(obj.c()而不是obj.c)调用c作为方法。这不是什么问题,但我相信它必须以某种方式工作,因为内置的length属性也是属性,而不是函数。此属性随对象动态更改,而不是函数 var str = "he

是否可以为对象指定动态属性,或者更确切地说,为对象属性指定动态?例如:

var obj = {
    a: 0,
    b: 5,
    c: //should always be a+b
}
显然,我可以使用方法
c=function(){returna+b}
,但是我总是需要使用大括号(
obj.c()
而不是
obj.c
)调用
c
作为方法。这不是什么问题,但我相信它必须以某种方式工作,因为内置的
length
属性也是属性,而不是函数。此属性随对象动态更改,而不是函数

var str = "hello world";
console.log(str.length); //11
str = "hello stack overflow";
console.log(str.length); //20
属性值在未更新的情况下更改

我希望您能帮助我:)

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

var obj={
答:0,,
b:5,
get c(){//在对象创建时分配它
返回这个.a+这个.b;
}
};
控制台日志(obj.c);
//将其添加到现有对象
Object.defineProperty(obj,'d'{
get:function(){
返回这个.a+this.b+this.c;
}
});
控制台日志(obj.d)您可以使用:


除了getter,您还可以使用ES6功能

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

var obj={
答:0,,
b:5,
},
p=新代理(obj{
获取:函数(目标、道具){
返回属性=='c'?target.a+target.b:target[prop];
}
});

控制台日志(p.c);//5
您正在寻找ES5获得者。但是
.length
不是动态的;字符串是不可变的。正如@SLaks提到的,需要注意的是,
String#length
不是动态属性,因为字符串的内部值无法更改。您的字符串示例并不能证明您的观点。您正在创建另一个长度不同的新字符串。与对象等价的是:
varobj={c:21};控制台日志(obj.c);obj={c:42};控制台日志(obj.c)。请参见,
c
也“动态”更改)
var o = {
   a : 0; 
   b : 1;
   get c () {return this.a + this.b;}

}