vue Proxy代理绑定

var hasHandler = {
      has: function has (target, key) {
        var has = key in target;
        var isAllowed = allowedGlobals(key) ||
          (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));
        if (!has && !isAllowed) {
          if (key in target.$data) { warnReservedPrefix(target, key); }
          else { warnNonPresent(target, key); }
        }
        return has || !isAllowed
      }
    };

    var getHandler = {
      get: function get (target, key) {
        if (typeof key === 'string' && !(key in target)) {
          if (key in target.$data) { warnReservedPrefix(target, key); }
          else { warnNonPresent(target, key); }
        }
        return target[key]
      }
    };

    initProxy = function initProxy (vm) {
      if (hasProxy) {
        // determine which proxy handler to use
        var options = vm.$options;
        var handlers = options.render && options.render._withStripped
          ? getHandler
          : hasHandler;
        vm._renderProxy = new Proxy(vm, handlers);
      } else {
        vm._renderProxy = vm;
      }
    };

 

 

看起来很简单的一段代码,这得多谢Proxy对象的普及,要知道老版本还在用Object.defineProperty 是多么可怕的一件事 特别是兼容Object和Array的下标变化!

 

这里唯一点不是很理解的地方就是render.withStripped是什么了  为什么这个配置会让这个绑定直接用get不用has 

 

说道 has 一般人不是很了解, 这个属性居然是用来监听迭代器的,通俗来说就是会响应in查询。  比如常见的判断 是否有这个属性的时候 "test" in a ;

posted @ 2021-10-09 16:29  blurs  阅读(69)  评论(0编辑  收藏  举报