Vue中利用defindProperty代理绑定data到vm对象上,this可以直接访问
function initData(vm) {
// 获取data
let data = vm.$option.data
// 忽略一些处理
// 调用自定义proxy
proxy(vm, `_data`, key)
}
const sharedPropertyDefinition = {
enumerable: true,
configurable: true,
get: noop,
set: noop
}
function proxy (target, sourceKey, key) {
// 自定义get
sharedPropertyDefinition.get = function proxyGetter() {
return this[sourceKey][key];
}
// 自定义set
sharedPropertyDefinition.set = function proxySetter(val) {
this[sourceKey][key] = val;
}
// 调用defineProperty代理data数据到target上,即vm对象,在Vue中使用this指向vm对象
Object.defineProperty(target, key, sharedPropertyDefinition)
}