如何理解es6中的Proxy?前端
试题解析:对proxy的理解,可能会延伸到vue的双向绑定vue
能够理解为为目标对象架设一层拦截,外界对该对象的访问,都必须经过这层拦截es6
简单示例:web
const obj = new Proxy({}, {
get: (target, key, receiver) => {
return 'JS'
console.log(`get ${key}`)
},
set: (target, key, value, receiver) => {
console.log(`set ${key}`)
},
})
obj.name = 'JS 每日一题'
// set name
// JS 每日一题
obj.name
// 这里进入get的回调函数,全部直接返回 JS
复制代码
从上面的示例中能够看出,Proxy存在一种机制,能够对外界的读写操做进行改写缓存
proxy除了代理get,set操做,还能代理其它的操做,以下安全
handler.getPrototypeOf()
// 在读取代理对象的原型时触发该操做,好比在执行 Object.getPrototypeOf(proxy) 时。
handler.setPrototypeOf()
// 在设置代理对象的原型时触发该操做,好比在执行 Object.setPrototypeOf(proxy, null) 时。
handler.isExtensible()
// 在判断一个代理对象是不是可扩展时触发该操做,好比在执行 Object.isExtensible(proxy) 时。
handler.preventExtensions()
// 在让一个代理对象不可扩展时触发该操做,好比在执行 Object.preventExtensions(proxy) 时。
handler.getOwnPropertyDescriptor()
// 在获取代理对象某个属性的属性描述时触发该操做,好比在执行 Object.getOwnPropertyDescriptor(proxy, "foo") 时。
handler.defineProperty()
// 在定义代理对象某个属性时的属性描述时触发该操做,好比在执行 Object.defineProperty(proxy, "foo", {}) 时。
handler.has()
// 在判断代理对象是否拥有某个属性时触发该操做,好比在执行 "foo" in proxy 时。
handler.get()
// 在读取代理对象的某个属性时触发该操做,好比在执行 proxy.foo 时。
handler.set()
// 在给代理对象的某个属性赋值时触发该操做,好比在执行 proxy.foo = 1 时。
handler.deleteProperty()
// 在删除代理对象的某个属性时触发该操做,好比在执行 delete proxy.foo 时。
handler.ownKeys()
// 在获取代理对象的全部属性键时触发该操做,好比在执行 Object.getOwnPropertyNames(proxy) 时。
handler.apply()
// 在调用一个目标对象为函数的代理对象时触发该操做,好比在执行 proxy() 时。
handler.construct()
// 在给一个目标对象为构造函数的代理对象构造实例时触发该操做,好比在执行new proxy() 时。
复制代码
如何用proxy实现双向绑定?bash
JS每日一题: 前端的缓存有哪些?都适用什么场景?区别是什么?
JS每日一题: Call,Apply,Bind的使用与区别,如何实现一个bind?
JS每日一题: 说说你对前端模块化的理解
JS每日一题: web安全攻击手段有哪些?以及如何防范app
JS每日一题能够当作是一个语音答题社区
天天利用碎片时间采用60秒内的语音形式来完成当天的考题
群主在第二天0点推送当天的参考答案模块化
点击加入答题函数