Skip to main content

代理模式

代理模式

代理有很多种类,比如保护代理会过滤请求,代理B可以拒绝将A发起的请求给传递给C;

虚拟代理会将一些操作交给代理执行,代理B可以在A满足某些条件下再执行操作,即虚拟代理会把一些开销大的对象延迟到真正需要它的时候再去创建。保护代理用于控制不同权限的对象对目标对象的访问,但在JavaScript中并不太容易实现保护代理,因为我们无法判断谁访问了某个对象。

代理模式,为一个对象找一个替代对象,以便对原对象进行访问。即在访问者与目标对象之间加一层代理,通过代理做授权和控制。

事件代理、jQuery的$.proxy、ES6的proxy都是这一模式的实现,下面以ES6的proxy为例:

let obj = { name: 'iphone', price: 99 }

let proxyObj = new Proxy(obj, {
get: function (target, key) {
// 对象中不存在属性名时返回0
return key in target ? target[key] : 0
},
// 通过代理,你可以轻松地验证向一个对象的传值。下面的代码借此展示了 set handler 的作用。
set: function (target, key, value) {
console.log('触发set:', { target, key, value })
if (key === 'price') {
if (value > 100) {
console.log("报价过高")
return false
}
}

// obj[prop] = value;
// return true; // 必须true 才成功赋值
// 等同下面
return Reflect.set(target, key, value)
}
})

console.log('1:', proxyObj.name); // iphone
console.log('2:', proxyObj.namex); // 0
proxyObj.price = 666;
console.log('3:', proxyObj.price) // 99
proxyObj.price = 98;
console.log('4:', proxyObj.price) // 98