代码是这样的...(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

解决方案 »

  1.   

    val不是引用 是闭包里的变量 这个变量一直在内存中 set的时候修改了这个变量
    类似这样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());
      

  2.   

    这里不是通过val = newValue设置了a属性的值而是每次要获取a属性的值时都调用一次
                    get:function(){
                        return val;
                    },
    这个函数,来返回val的值
      

  3.   


    哦,是的哦, 那如果不用闭包,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);```该怎么办呢?
      

  4.   

    你总得有个地方存对应的值啊
    或者单独写个方法 或者用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);