function observe(obj) {
if (!obj || typeof obj !== 'object') {
return
}
Object.keys(obj).forEach(
item => {
redefinedObj(obj, key, obj[key])
}
)
function redefinedObj(obj, key, value) {
observe(value)
Object.defineProperty(obj, key, {
configurable: true,
enumerable: true,
set: (newVal) => {
observe(value)
if (newVal !== value) {
console.log('set', newVal)
value = newVal
}
},
get: () => {
console.log('get', value)
return value
}
})
}
}
class Vue {
constructor(option) {
this.data = opetion.data
observe(this.data)
}
}
let obj = {
name: '前端工匠',
age: { age: 100 },
arr: [1, 2, 3]
}
let handler = {
get(target, key) {
console.log("代理执行")
if (typeof target[key] == 'object' && target[key] !== null) {
return new Proxy(target[key], handler)
}
return Reflect.get(target, key)
},
set(target, key, value) {
if (key === 'length') return true
render()
return Reflect.set(target, key, value)
}
}
let ap = new Proxy(obj, handler)
let x = ap.age
x.age