js使用Proxy代理Class的公有方法初步尝试

js使用Proxy代理Class的公有方法初步尝试

最近遇到一个需求是在前端对api进行权限管控,由于项目中的api都是封装在不同的class中,具体代码如下。

import http from "../../network";
export class LoginApi {
  signin(body) {
    return http.post("/users/signin", body);
  }
  signout() {
    return http.get("/users/signout");
  }
  signup(body) {
    return http.post("/users", body);
  }
  isAuth() {
    return http.get("/users/isAuth");
  }
}

在每个页面都分别实例,调用公有方法请求api,对于权限管控考虑使用代理的方式来处理,代码尝试如下。

  • 第一种方法考虑直接先实例化class,使用Proxy直接代理实例
class LoginApi {
    signin() {
      console.log("/users/signin");
    }
    signout() {
      console.log("/users/signout");
    }
    signup(body) {
      console.log("/users/");
    }
    isAuth() {
      console.log("/users/isAuth");
    }
  }
  export loginApi = new Proxy(new LoginApi(), {
    get: function (target, propKey, receiver) {
    //伪代码
      console.log(`getting ${propKey}!`);
      if(propKey === 'isAuth') {
        return () => { console.log('没有权限'); }
      }
      return Reflect.get(target, propKey, receiver);
    }
  })
//在页面调用
  loginApi.signin()
  loginApi.isAuth()
  • 第二种考虑到构造器里this就是代理的目标,直接在构造函数里对this进行代理,在外部调用时使用代理后的proxy实例。
export class LoginApi {
   constructor () {
     this.proxyApi = new Proxy(this, {
       get(target, propKey, receiver) {
       //伪代码
         if(propKey === 'isAuth') {
           return () => { console.log('没有权限'); }
         }
         return Reflect.get(target, propKey, receiver);
       }
     })
   }
   signin() {
     console.log("/users/signin");
   }
   signout() {
     console.log("/users/signout");
   }
   signup(body) {
     console.log("/users/");
   }
   isAuth() {
     console.log("/users/isAuth");
   }
 }
// 外部调用
const loginApi = new LoginApi()
loginApi.proxyApi.isAuth()
loginApi.proxyApi.signout()

然而两种方法都感觉都不是很优雅,这里也有一个疑惑,如果一个class只有公有方法不存在私有属性,那这个class的实例化是否有意义?等以后研究出更好的方法再来更新,欢迎评论留言。

Vue 3中引入了Proxy作为响应式系统的核心,它可以用于代理对象并拦截其属性的访问。通过使用Proxy,我们可以更加灵活地对数据进行监听和响应。 在Vue 3中,使用Proxy代理的步骤如下: 1. 创建一个普通的JavaScript对象作为数据源。 2. 使用`new Proxy(target, handler)`创建一个代理对象,其中`target`是要代理的对象,`handler`是一个包含拦截器方法的对象。 3. 在`handler`对象中定义拦截器方法,例如`get`、`set`、`deleteProperty`等。这些方法会在对代理对象进行相应操作时被调用。 4. 将代理对象作为Vue实例的数据源。 下面是一个简单的示例代码,演示了如何使用Proxy代理对象: ```javascript // 创建一个普通的JavaScript对象作为数据源 const data = { name: 'John', age: 25 }; // 使用Proxy创建代理对象 const proxy = new Proxy(data, { get(target, key) { console.log(`访问了属性 ${key}`); return target[key]; }, set(target, key, value) { console.log(`设置了属性 ${key} 的值为 ${value}`); target[key] = value; } }); // 将代理对象作为Vue实例的数据源 const app = Vue.createApp({ data() { return { person: proxy }; } }); // 在Vue模板中使用代理对象的属性 app.mount('#app'); ``` 在上述示例中,我们创建了一个普通的JavaScript对象`data`作为数据源,并使用Proxy创建了代理对象`proxy`。在代理对象的`get`和`set`方法中,我们分别打印了访问和设置属性的信息,并对原始对象进行了相应的操作。最后,将代理对象作为Vue实例的数据源,并在Vue模板中使用代理对象的属性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值