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

参考

相关推荐
木雷坞9 小时前
PHP两项9.2分漏洞:Docker容器更新与版本核验教程
开发语言·docker·php
2601_962885729 小时前
如何用 Python 做 MACD 金叉全市场选股?
开发语言·python
FfHUCisI9 小时前
无锁 Reactor 网络模型与 gnet / evio 架构拆解
服务器·开发语言·后端·golang
笨笨饿9 小时前
#145 _Codex 三层故障详细排查与修复步骤
开发语言·人工智能·stm32·单片机·嵌入式硬件
心中有你02149 小时前
C 语言文件操作详解:从写入、追加到读取与定位的完整 实战
c语言·开发语言
小张成长计划..9 小时前
【Linux】26:线程互斥和同步
java·开发语言
阿里嘎多学长17 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
布吉岛的石头18 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!18 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc19 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash