我们一些操作前,必须得判断用户是否登录,比较点赞、结算、发送弹幕…按照之前的写法,我们必须在每一个方法中判断用户的登录情况,然后再进行业务的操作,很显然前置条件和业务又混到了一起,用修饰器,就可以完美的解决这一问题,代码如下

  1. class User {
  2. // 获取已登录用户的用户信息
  3. @checkLogin
  4. getUserInfo() {
  5. /**
  6. * 之前,我们都会这么写:
  7. * if(checkLogin()) {
  8. * // 业务代码
  9. * }
  10. * 这段代码会在每一个需要登录的方法中执行
  11. * 还是上面的问题,执行的前提和业务又混到了一起
  12. */
  13. console.log('获取已登录用户的用户信息')
  14. }
  15. // 发送消息
  16. @checkLogin
  17. sendMsg() {
  18. console.log('发送消息')
  19. }
  20. }
  21. // 检查用户是否登录,如果没有登录,就跳转到登录页面
  22. function checkLogin(target, name, descriptor) {
  23. let method = descriptor.value
  24. // 模拟判断条件
  25. let isLogin = true
  26. descriptor.value = function (...args) {
  27. if (isLogin) {
  28. method.apply(this, args)
  29. } else {
  30. console.log('没有登录,即将跳转到登录页面...')
  31. }
  32. }
  33. }
  34. let u = new User()
  35. u.getUserInfo()
  36. u.sendMsg()

结语

以上只是修饰器的基本应用,只要我们掌握了原理,在实际的工作中,要思考自己的应用场景,只要我们涉及需要在执行前做一些处理的应用,不管是修改函数的参数值,还是增加属性,还是执行的先决条件,我们都可以使用修饰器,这种编程的方式,就是面向切面编程
更多关于js装饰器的内容可以看我这篇文章