javascript-装饰器

news/2024/9/19 13:36:52/ 标签: javascript, 开发语言, ecmascript

装饰器

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

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

本质上是语法糖,借助 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?

http://www.ppmy.cn/news/1527663.html

相关文章

我为什么不建议你随意入行做AI产品经理❓

我为什么不建议你随意入行做AI产品经理❓ 如果你是0基础想做产品经理,也想了解ai领域,那么请认真看完, 大家也知道,普通人转行,是有时间窗口的,当你看到一个还不错的领域,如果转行的风险可控&a…

哪些人适合学习人工智能?

人工智能(AI)的浪潮正席卷全球,它不仅是科技领域的一场革命,更是社会进步的重要推手。随着AI技术的不断成熟和应用领域的不断拓展,越来越多的人开始关注并渴望掌握这一前沿技术。那么,究竟哪些人适合学习人…

Android 车联网——汽车模块介绍(附1)

汽车模块指的是车辆中独立的电子控制单元(ECUs),如发动机控制单元(ECU)、车身控制模块(BCM)等,它们负责特定的功能或系统。 一、控制类模块 这些模块主要用于控制车辆的不同系统,确保车辆各部分的正常运行。 1、ECM ECM(Electronic Control Module,电子控制模块)…

Python计算机视觉编程 第八章 图像内容分类

目录 K邻近分类法(KNN)用稠密SIFT作为图像特征 贝叶斯分类器支持向量机(SVM)使用LibSVM 光学字符识别(OCR)训练分类器选取特征多类支持向量机 K邻近分类法(KNN) 算法步骤&#xff1…

C:题目介绍

一、算天数 1.题目: kiki向获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。 输入描述: 多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。 输出…

《C++移动语义:解锁复杂数据结构的高效之道》

在 C的编程世界中,移动语义是一项强大的特性,它能够在处理复杂数据结构如链表、树等时,极大地提高程序的性能和效率。理解并正确实现移动语义在这些复杂数据结构中,对于开发者来说至关重要。 一、移动语义简介 C11 引入了移动语…

Docker 镜像制作(Dockerfile)

1 Dockerfile 概念 Dockerfile 是什么? 镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是 Dockerfile。 Dockerfile 是一个文本文件&a…

Redis常见应用场景

目录 一、实现博客点赞功能 二、实现博客点赞用户列表功能 三、好友关注和取关以及求共同关注 四、实现关注推送 1、拉模式 2、推模式 3、推拉结合 四、三种模式对比 这里简单记录一下,没有实现方法,只是帮助记忆 一、实现博客点赞功能 可以通…

【机器学习导引】ch2-模型评估与选择

文章目录 经验误差与过拟合 (Empirical error &overfitting)1. **均方误差(Mean Squared Error, MSE)**2. **均方根误差(Root Mean Squared Error, RMSE)**3. **平均绝对误差(Mean Absolute…

MySQL基础(11)- 创建管理表

目录 一、数据库的常见、删除与修改 1.如何创建数据库 2.管理数据库 3.修改数据库 4.删除数据库 5.如何创建数据表 6.修改表 --> ALTER TABLE 7.重命名表 8.删除表 9.清空表 10.DCL 中 COMMIT 和 ROLLBACK 11.对比 TRUNCATE TABLE 和 DELETE FROM 12.DDL 和…

爬虫代理API的全面解析:让数据抓取更高效

在大数据时代,网络爬虫已经成为收集和分析数据的重要工具。然而,频繁的请求会导致IP被封禁,这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用,帮助你更高效地进行数据抓取。 什么是爬虫代理AP…

k8s环境下的相关操作

9.12 k8s calico的部署 # lsanaconda-ks.cfg k8s-ha-install kubeadm-config.yaml new.yaml token# 切换 git 分⽀[rootk8s-master ~]# cd k8s-ha-install/[rootk8s-master k8s-ha-install]# git checkout manual-installation-v1.28.x && cd calico/分支 manual…

C# SQL 辅助工具

{/// <summary>/// sql 辅助工具/// </summary>public class SqlStructureHelps{#region 增删改查/// <summary>/// 截断/// </summary>/// <typeparam name"T"></typeparam>/// <returns></returns>public static …

vue2项目实现国际化(若依框架示例)

本文主要梳理vue2项目实现全项目格式化&#xff0c;在导航栏中切换&#xff0c;页面中所有的组件的默认语言随之切换&#xff0c;搭配vue-i18n插件 文章目录 基础准备引入插件vue-i18n 实现示例流程1. 创建国际化文件1.1 element文件夹1.2 locales文件夹1.3 index.js1.4 change…

Vue 3有哪些新特性

Composition API&#xff1a; 这是 Vue 3 中最引人注目的新特性之一。Composition API 提供了一种全新的方式来组织和重用逻辑。它允许你将组件的逻辑按功能组织成可复用的代码块&#xff08;称为“组合式函数”&#xff09;&#xff0c;而不是像 Vue 2 那样按选项&#xff08;…

【乐企-业务篇】开票前置校验服务-规则链服务接口实现(发票基础信息校验)

开票前置校验服务-规则链服务接口实现(发票基础信息校验) 代码 import liquibase.pro.packaged.L; import org.apache.commons.collections4.Collec

wpf 使用Oxyplot 库制作图表示例

方法&#xff1a; InitTable 方法&#xff1a;负责初始化图表模型&#xff0c;包括设置图表的样式、坐标轴、系列和注释。这个方法包括多个 Init 方法的调用&#xff0c;表示图表的初始化过程可以分步骤进行。 InitGoalPoint 方法&#xff1a;当前未实现&#xff0c;但预留了子…

渗透测试综合靶场 DC-2 通关详解

一、准备阶段 准备工具如Kali Linux&#xff0c;下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段&#xff0c;通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …

Flutter - Win32程序是如何执行main函数

Win32程序的主体结构 int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,_In_ wchar_t *command_line, _In_ int show_command) {// Attach to console when present (e.g., flutter run) or create a// new console when running with a debugger.if …

软件编程随想

已经做了16年左右的软件开发&#xff0c;从最初的Delphi开发&#xff0c;到后来的Web开发&#xff08;.net)再到Java Web&#xff08;Spring MCV,SpringBoot&#xff09;开发&#xff0c;以后Python&#xff0c;NodeJS等开发&#xff0c;做了这么多年&#xff0c;全部是以解决单…