javascript-装饰器

装饰器

装饰者模式:能够在不改变对象自身基础上,在程序运行期间给对象添加职责

装饰器只能针对类和类的属性,不能直接作用于函数(由于存在函数提升)

本质上是语法糖,借助 Object.defineProperty(target,name,descriptor) 添加和修改对象的属性

属性描述符

  • 数据描述符
  • 存取描述符

使用场景

  • log
  • time 统计方法执行的时间
  • readonly/...
  • debounce 对执行的方法执行防抖处理
  • mobx 实践

类装饰器

log

js 复制代码
function log(Class) {
  return (...args) => {
    console.log(args);
    return new Class(...args);
  };
}

@log
class Animal {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

const cat = new Animal("Hello kitty", 2);
//  ["Hello kitty", 2]
console.log(cat.name);
// Hello kitty

属性装饰器

js 复制代码
function log(target, name, descriptor) {
  const original = descriptor.value;
  if (typeof original === "function") {
    descriptor.value = function (...args) {
      console.log(`log for args: ${args}`);
      try {
        return original.apply(this, args);
      } catch (e) {
        console.log(`Error: ${e}`);
        throw e;
      }
    };
  }
  return descriptor;
}

class Animal {
  constructor(name) {
    this.name = name;
  }
  @log
  sayHello(name) {
    console.log(`Hello ${name}, I'm ${this.name}`);
  }
}

const cat = new Animal("Hello kitty");
cat.sayHello("Jack");
// log for args: Jack
// Hello Jack, I'm Hello kitty

参考

相关推荐
散峰而望3 分钟前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
冷凝雨9 分钟前
复数乘法(C & Simulink)
c语言·开发语言·信号处理·simulink·dsp
CoderCodingNo13 分钟前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
前端小L21 分钟前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
0和1的舞者21 分钟前
Spring AOP详解(一)
java·开发语言·前端·spring·aop·面向切面
web小白成长日记25 分钟前
在Vue样式中使用JavaScript 变量(CSS 变量注入)
前端·javascript·css·vue.js
MoonBit月兔30 分钟前
年终 Meetup:走进腾讯|AI 原生编程与 Code Agent 实战交流会
大数据·开发语言·人工智能·腾讯云·moonbit
智航GIS36 分钟前
8.2 面向对象
开发语言·python
C_心欲无痕36 分钟前
react - useImperativeHandle让子组件“暴露方法”给父组件调用
前端·javascript·react.js
小小星球之旅44 分钟前
CompletableFuture学习
java·开发语言·学习