代码是这样的...(function(){
window.Observer = function(data){
this.data=data;
for(var key in this.data){
var val = this.data[key];
this.walk(val,key);
}
};
Observer.prototype.walk = function(val,key){
Object.defineProperty(this.data,key,{
enumerable: true,
configurable: true,
get:function(){
return val;
},
set:function(newValue){
val = newValue;
}
})
};
})()
var app = new Observer({a:"a"});console.info(app.data.a);
app.data.a = "b"; console.info(app.data.a);然后输出为 a b;为什么通过val = newValue可以设置a属性的值?
val难道是一个引用?
如果val存的是地址,可是这样为什么又不行var a = {b:0}
var val = a.b;
val = 1//a.b任然是0
window.Observer = function(data){
this.data=data;
for(var key in this.data){
var val = this.data[key];
this.walk(val,key);
}
};
Observer.prototype.walk = function(val,key){
Object.defineProperty(this.data,key,{
enumerable: true,
configurable: true,
get:function(){
return val;
},
set:function(newValue){
val = newValue;
}
})
};
})()
var app = new Observer({a:"a"});console.info(app.data.a);
app.data.a = "b"; console.info(app.data.a);然后输出为 a b;为什么通过val = newValue可以设置a属性的值?
val难道是一个引用?
如果val存的是地址,可是这样为什么又不行var a = {b:0}
var val = a.b;
val = 1//a.b任然是0
类似这样function test(v){
function gets(){
return v;
}
function sets(c){
v=c;
}
return {gets,sets};
}
const {gets,sets}=test(2);
console.log(gets());
sets(3);
console.log(gets());
get:function(){
return val;
},
这个函数,来返回val的值
哦,是的哦, 那如果不用闭包,set中应该怎么样去获取值呢?
```
类似这样的话,会不停调用自己
var a = {
b:0
} Object.defineProperty(a,"b",{
enumerable: true,
configurable: true,
get:function(val){
return val;
},
set:function(newValue){
this.b = newValue;
}
})a.b = 2 ; console.info(a.b);```该怎么办呢?
或者单独写个方法 或者用es6的Proxy试试 但其实也就是不用你自己存而已 他帮你放到对象里const p=new Proxy({},{
set(target,key,value){
console.log('set');
return Reflect.set(target,key,value);
},
get(target,key){
console.log('get');
return Reflect.get(target,key);
}
});
p.a=1;
console.log(p.a);