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 ;