给对象的所有方法优雅的添加异常处理
背景
为了保证程序的健壮性,需要做异常处理。比如有一个对象,里面有一些方法,像下面这样👇🏻
const obj = { a() { try { // ... } catch (e) { // ... } }, b() { try { // ... } catch (e) { // ... } }}如果对象里面的方法很多,每个都加 try catch 真心好麻烦,这时候就想有一种方式可以对所有方法做异常处理🤤
利用代理模式实现
代理模式简介
代理模式可以给目标对象做一层包装,可以方便的去控制对对象的访问。
比如下面这个明星-经纪人的例子,olu是迪士尼的热门明星,拥有姓名、年龄和手机号三个属性。如果平日游客去找它问是问不到的,那么就可以去和olu的饲养员也就是经纪人搞好关系问一下。
olu是明星嘛,找经纪人问电话也只能得到经纪人的电话,明星的电话哪能随便透露;想约olu出去耍要报价,这里也是经纪人代替明星报价。除了这俩属性,问olu的姓名和年龄经纪人还是会告诉的。
// 明星const star = { name: 'olu', age: 18, phone: 120110109,}
// 经纪人const agent = new Proxy(star, { get: function(target, key) { if (key === 'phone') { // 返回经纪人的手机号 return 12315 } if (key === 'price') { // 经纪人代替明星报价 return 521 } return target[key] }, set: function(target, key, val) { if (key === 'customPrice') { if (val < 520) { // 报价最低 520 throw new Error('olu 没有这么便宜!') } else { target[key] = val return true } } }})
console.log(agent.name) // 明星的console.log(agent.age) // 明星的console.log(agent.phone) // 经纪人的console.log(agent.price) // 经纪人提供agent.customPrice = 11 // error具体实现
首先定义一个createProxy方法来实现代理👇🏻
const createProxy = target => { const proxy = createExceptionProxy() return new Proxy(target, { get: proxy, set: proxy })}
// 如果 target 不包含 prop 就返回空,包含则返回对应的属性值, 如果是函数,做一层包装const createExceptionProxy = () => (target, prop) => { if (!(prop in target)) { return }
if (typeof target[prop] === 'function') { return createExceptionZone(target, prop) }
return target[prop]}
const createExceptionZone = (target, prop) => {
}