var handler = { get: (target, key) => { invariant(key, 'get') return target[key] }, set: (target, key, value) => { invariant(ket, 'set') target[key] = value returntrue }, } varinvariant = (key, action) => { if (key[0] === '_') { thrownewError(`Invalid attempt to ${action} private ${key} property`) } } var target = {} var proxy = newProxy(target, handler) proxy._prop // Uncaught Error: Invalid attempt to get private _prop property proxy._prop = 1 // Uncaught Error: Invalid attempt to set private _prop property
apply()
apply方法拦截函数的调用,call,apply操作
apply方法接受三个参数:目标对象,目标对象的上下文对象(this)和目标对象的参数数组
1 2 3 4 5 6 7 8 9
vartarget = () => { return"I am the target" } var handler = { apply() { return"I am the proxy" } } var proxy = newProxy(target, handler) console.log(proxy()) // I am the proxy
has()
has方法用来拦截HasProperty操作,即判断对象是否具有具有某个属性时,这个方法会生效,典型的操作就是 in 运 算符
1 2 3 4 5 6 7 8 9 10 11
var handler = { has(target, key) { if (key[0] === '_') { returnfalse } return key in target } } var target = { _prop: 'foo', prop: 'bar' } var proxy = newProxy(target, handler) console.log('_prop'in proxy) // false