vue Proxy代理绑定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 ;