当前位置: 首页 > news >正文

javascript-装饰器

装饰器

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

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

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

属性描述符

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

使用场景

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

类装饰器

log

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

属性装饰器

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;}@logsayHello(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

参考

  • https://zhuanlan.zhihu.com/p/189960001
  • https://juejin.cn/post/7153833151217795080
  • https://jelly.jd.com/article/6030875363dc65014d6fb76f
  • 如何看待 ECMAScript 装饰器(Decorators)提案进入 stage 3?

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具
  • Java stream().anyMatch
  • 无线安全(WiFi)
  • vulnhub(8):pWnOS(还没信息收集就已经成功打点)
  • 最佳实践 · MySQL 分区表实战指南
  • Java 实现桌面烟花秀
  • 树——数据结构
  • 计算机网络第二章:作业 1: Web 服务器
  • 相机光学(三十七)——自动对焦原理
  • 2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序
  • OpenCV高阶操作
  • 耐压110V茂睿芯MK9019可以向下兼容MK9016
  • 找了一家征信公司,干了两个多月。。。
  • 【每日一诗】【诗词创作】【诗】《雨前秋夜》
  • mysql 修改索引
  • #Java异常处理
  • 【comparator, comparable】小总结
  • android图片蒙层
  • canvas 高仿 Apple Watch 表盘
  • CentOS 7 修改主机名
  • CSS相对定位
  • dva中组件的懒加载
  • eclipse(luna)创建web工程
  • ES6 学习笔记(一)let,const和解构赋值
  • js
  • magento2项目上线注意事项
  • V4L2视频输入框架概述
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 爱情 北京女病人
  • 初识 beanstalkd
  • 诡异!React stopPropagation失灵
  • 深入浅出Node.js
  • 十年未变!安全,谁之责?(下)
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Spring第一个helloWorld
  • ​Java并发新构件之Exchanger
  • ​Redis 实现计数器和限速器的
  • # centos7下FFmpeg环境部署记录
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #include
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $refs 、$nextTic、动态组件、name的使用
  • (26)4.7 字符函数和字符串函数
  • (3) cmake编译多个cpp文件
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (TOJ2804)Even? Odd?
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (离散数学)逻辑连接词
  • (篇九)MySQL常用内置函数
  • (七)Knockout 创建自定义绑定
  • (三)Honghu Cloud云架构一定时调度平台
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)h264中avc和flv数据的解析