理解装饰器是怎么使用的
时间:2022-07-25
本文章向大家介绍理解装饰器是怎么使用的,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
js 和 ts 中经常看到@
+函数名
的字样这个就是装饰器。它可以修饰类,类的属性,类的原型上的方法,说的简单一点它就是一个函数,可以传递参数在修饰的时候把这个类的属性传递给修饰的函数。
@flag("帅")
class Animal{
@readOnly
age = 18
constructor(){
this.name = '小丑'
}
@before
address(){
console.log(this);
console.log("小丑的小屋");
}
}
配置环境
装饰器还不被浏览器解析,需要通过babel
来转化之后才行。
我们需要借助@babel/cli[1]来编译文件
安装@babel/cli
最好是安装到本地项目中,通过npx
来启动babel
去编译,不要全局安装@babel/cli
到本机上,会有不同版本babel
的问题,被坑哭了
npx
是node
提供的,可以帮助我们执行.bin
目录下的文件
需要安装的插件
npm install @babel/core @babel/cli -D
npm install @babel/preset-env -D
npm install @babel/plugin-proposal-class-properties -D 主要作用是用来转化类的属性的
npm install @babel/plugin-proposal-decorators -D
需要配置的文件.babelrc
{
"presets":[ //预设包
"@babel/preset-env"
],
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose" : true }]
]
}
编译命令
npx babel xxx.js -o xxx.js
修饰类的静态属性
function flag(){
console.log(arguments);
}
function flag(custructor){
custructor.type="帅"
}
console.log(Animal.type) //❌这个写法是错误的
编译后的 es5
"use strict";
var _dec, _class, _temp;
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
var Animal =
((_dec = flag()),
_dec(
(_class =
((_temp = /*#__PURE__*/ (function () {
function Animal() {
_classCallCheck(this, Animal);
this.age = 18;
this.name = "小丑";
}
_createClass(Animal, [
{
key: "address",
value: function address() {
console.log(this);
console.log("小丑的小屋");
},
},
]);
return Animal;
})()),
_temp))
) || _class);
function flag(custructor) {
custructor.type = "帅";
}
console.log(Animal.type);
抽取代码之后是一个自执行函数,传入返回的构造函数之后执行
装饰器函数可以改造为:
function flag(value){
return function(custructor){
custructor.type = value
}
}
console.log(Animal.type); //✔ 帅
修改类的属性(实例上的属性)
function readOnly(target,prototype,descriptor){
console.log(arguments)
descriptor.writable = false;
console.log(arguments);
setTimeout(()=>{
console.log(target == Animal.prototype); //类的原型
console.log(Animal.prototype); //{constructor: ƒ, address: ƒ}
console.log(Animal.prototype.constructor);
})
}
let a= new Animal();
console.log(a.age) //18
a.age =19
console.log(a.age) //❌ read only
修改原型上的方法
function before(target,prototype,descriptor){
console.log(arguments)
let oldSay = descriptor.value;
descriptor.value = function(){
console.log('before');
console.log(...arguments);
oldSay.call(target,...arguments)
}
//console.log(descriptor);
}
let a= new Animal();
a.address() //小丑的小屋
执行结果:
参考资料
[1]babel-cli: https://www.babeljs.cn/docs/babel-cli
- Paket 介绍
- C语言学不会,编程能力无法提升?你的问题我来解决!
- 实现WCF和Unity 的集成
- Qt中纯C++项目发布为dll的方法(超详细步骤)
- .NET的Actor模型:Orleans
- UML:类图复习-鸡生蛋,蛋生鸡
- DotNet多个程序集合并工具
- Spring官网下载dist.zip的几种方法
- Spring Security笔记:HTTP Basic 认证
- WordPress免插件仅代码实现文章浏览次数的方法(1)
- Reflector 插件
- java:多线程基础之Runnable、Callable与Thread
- 这个美女程序员写的代码,带人类成功登月
- Hadoop基础教程——Hadoop单机版搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python数据科学:卡方检验
- Java 中使用 Redis
- Python数据科学:线性回归
- 人生苦短,我用k8s--------------单节点二进制部署
- 人生苦短,我用k8s--------------k8s集群二进制部署
- 从零开始学习 JD Chain(四)-使用穿透式检索-Release
- 用Python清除文件夹中的重复视频
- Python数据科学:线性回归诊断
- 用Python自动化生成倒计时图片
- (译)SDL编程入门(12)色彩调制
- (译)SDL编程入门(11)裁剪渲染和精灵表
- Python数据科学:正则化方法
- libVLC教程
- (译)SDL编程入门(10)Color Key
- Cocos2d-x初学者教程