Vue data 和 methods 的解释

Person(options) {
      let vm = this;
      vm.$options = options;

      if(options.data) {
        initData(vm);
      }
      if(options.methods) {
        initMethods(vm, options.methods);
      }
      function initData(vm) {
        let data = vm._data = vm.$options.data;

        let keys = Object.keys(data);

        let len = keys.length;
        while(len--) {
          let key = keys[len];
          proxy(vm, "_data", key);
        }
      }
      function proxy(target, sourceKeys, key) {
        var sharedPropertyDefinition = {
          enumerable: true,
          configurable: true,
          get: noop,
          set: noop
        }

        sharedPropertyDefinition.get = function() {
          return this[sourceKeys][key]
        }

        sharedPropertyDefinition.set = function(val) {
          this[sourceKeys][key] = val;
        }

        Object.defineProperty(target, key, sharedPropertyDefinition);
      }
      function noop(a,b,c){ 
        console.log(a,b,c);
      }
      function initMethods(vm, methods) {
        for (let key in methods) {
          vm[key] = typeof methods[key] === 'function' ? methods[key].bind(vm) : noop;
        }
      }    
    },
    init() {
      let p1 = new this.Person({
        data: {
          name: 'pino',
          age: 18
        },
        methods: {
          sayName() {
            console.log('I am' + this.name);
          }
        }
      });

      console.log(p1.name);
      p1.sayName();
    }

主要是 proxy 代理,正常访问是 this.name ,但是挟持了一下就变成了 this. _data.name。赋值的时候同样。

然后把 methods 的中的方法,在 vm 上也来了一份,就可以 vm.方法名。

不懂的是,vm 与 this 怎么交互的,_data 这个东西只给了 vm,结果 this 也有了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值