ECMAScript Decorators---装饰器
ECMAScript Decorators---装饰器
Decorators是什么
- Decorators可以改变类方法和类实例字段的属性和行为,使我们可以灵活地使用更简单的语法动态实现这些内容,是非侵入式的。---举例,你给手机添加一个外壳罢了,并不影响手机原有的通话、充电等功能
应用场景
- Decorators的经典的应用是AOP编程,比如“日志系统”,日志系统的作用是记录系统的行为操作,它在不影响原有系统的功能的基础上增加记录环节
- 更加抽象的理解,可以理解为给数据流做一层filter,因此 AOP 的典型应用包括安全检查、缓存、调试、持久化等等。
原理
- Decorators的本质是利用了ES5的Object.defineProperty属性,这三个参数其实是和Object.defineProperty参数一致的,因此不能更改
- object 必需。要在其上添加或修改属性的对象 这可能是一个本机JavaScript对象(即用户定义的对象或内置对象)或 DOM 对象。
- propertyname必需。一个包含属性名称的字符串
- descriptor 必需。 属性描述符。它可以针对数据属性或访问器属性。
- 举例说明
var myObj = {myPropOne: 1,myPropTwo: 2
};
// modify property descriptor
Object.defineProperty( myObj, 'myPropOne', {writable: false, // 是否允许该属性值更改enumerable: false, // 是否允许key被枚举,话句话说for in 或者Object.keys() 不会输出keyconfigurable: false// 目标属性是否可以被删除或是否可以再次修改特性
} );
应用举例
- 类方法 @readonly
class User {constructor( firstname, lastName ) {this.firstname = firstname;this.lastName = lastName;}@readonlygetFullName() {return this.firstname ' ' this.lastName;}
}
// create instance
let user = new User( 'John', 'Doe' );
console.log( user.getFullName() );// 某天我不小心重写了这个方法
User.prototype.getFullName = function() {return 'HACKED!';
}// 输出 HACKED! 与预期不符,怎么避免此类情况发生// 方法1 这是最好的解决方案么?修饰器登场
Object.defineProperty( User.prototype, 'getFullName', {writable: false
});// 将此方法添加到修饰方法getFullName上
function readonly( target, property, descriptor ) {descriptor.writable = false;return descriptor;
}
- 类方法 @log日志打印
function log( logMessage ) {// return decorator functionreturn function ( target, property, descriptor ) {// save original value, which is method (function)let originalMethod = descriptor.value;// replace method implementationdescriptor.value = function( ...args ) {console.log( '[LOG]', logMessage );// here, call original method// `this` points to the instancereturn originalMethod.call( this, ...args );};return descriptor;}
}
class User {constructor( firstname, lastName ) {this.firstname = firstname;this.lastName = lastName;}@log('calling getFullName method on User class')getFullName() {return this.firstname ' ' this.lastName;}
}
var user = new User( 'John', 'Doe' );
console.log( user.getFullName() );
- 类的属性 大小写转换
// 解释:descriptor.initializer函数由Babel内部使用来创建对象属性的属性描述符的值
function toCase( CASE = 'lower' ) {return function ( target, name, descriptor ) {let initValue = descriptor.initializer();descriptor.initializer = function(){return ( CASE == 'lower' ) ? initValue.toLowerCase() : initValue.toUpperCase();}return descriptor;}
}
class User {@toCase( 'upper' )firstName = 'default_first_name';lastName = 'default_last_name';constructor( firstName, lastName ) {if( firstName ) this.firstName = firstName;if( lastName ) this.lastName = lastName;}getFullName() {return this.firstName ' ' this.lastName;}
}
console.log( new User() );
- 类装饰器
function withLoginStatus( UserRef ) {return class extends UserRef {constructor( ...args ) {super( ...args );this.isLoggedIn = false;}setLoggedIn() {this.isLoggedIn = true;}}
}
@withLoginStatus
class User {constructor( firstName, lastName ) {this.firstName = firstName;this.lastName = lastName;}
}
let user = new User( 'John', 'Doe' );
console.log( 'Before ===> ', user );
// set logged in
user.setLoggedIn();
console.log( 'After ===> ', user );
babel 装换
- 在线转换链接(如无法打开网页需翻墙)
- 构建babel装换
1、创建项目文件
2、命令行进入该项目目录 npm init
3、npm install babel-core babel-plugin-transform-decorators
4、安装 npm install babel-plugin-transform-decorators-legacy --save-dev
5、.babelrc添加
{ "plugins": [ "transform-decorators-legacy"]
}
参考链接
- ECMAScript Decorators---装饰器
- ES7 Decorator 装饰者模式
- 阮一峰---修饰器
ECMAScript Decorators---装饰器相关推荐
- decorators 参数_Django中decorators装饰器的使用
1.CBV实现的登录视图 classLoginView(View):defget(self, request):"""处理GET请求""" ...
- Decorators TypeScript 装饰器
Decorators 装饰器(Decorator)用来增强 JavaScript 类(class)的功能,许多面向对象的语言都有这种语法,目前有一个提案将其引入了 ECMAScript. 装饰器是一种 ...
- 了解TypeScript装饰器
一.创建demo文件 typeScript是一门基于JavaScript之上的一门语言.是JS的扩展集和超集.任何一种javascript运行环境都支持. yarn init --yes yarn a ...
- Struts和Sitemesh整合,实现多个装饰器
2019独角兽企业重金招聘Python工程师标准>>> web.xml配置 <filter><filter-name>struts-prepare</f ...
- CDI services--Decorators(装饰器)
1.Decorators装饰器综述 拦截器是一种强大的方法在应用程序捕捉运行方法和解耦.拦截器可以拦截任何java类型的调用. 这使得拦截器适合解决事务管理,安全性,以及日记记录. 本质上说,拦截 ...
- java 设计模式 示例_Java示例中的装饰器设计模式
java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...
- python 装饰器(Decorators)原理说明
本文目的是由浅入深地介绍python装饰器原理 装饰器(Decorators)是 Python 的一个重要部分 其功能是, 在不修改原函数(类)定义代码的情况下,增加新的功能 为了理解和实现装饰器,我 ...
- python 装饰器分类_Python 装饰器(Decorators) 超详细分类实例
Python装饰器分类 Python 装饰器函数: 是指装饰器本身是函数风格的实现; 函数装饰器: 是指被装饰的目标对象是函数;(目标对象); 装饰器类 : 是指装饰器本身是类风格的实现; 类装饰器 ...
- 一文读懂 @Decorator 装饰器——理解 VS Code 源码的基础
作者:easonruan,腾讯 CSIG 前端开发工程师 1. 装饰器的样子 我们先来看看 Decorator 装饰器长什么样子,大家可能没在项目中用过 Decorator 装饰器,但多多少少会看过下 ...
最新文章
- Cordova+jQuery Mobile+Spring REST
- 怎么全量备份oracle数据库,Oracle 数据库全量备份恢复和部分备份恢复 | 学步园...
- hdu 2896 病毒侵袭(AC自动机)
- jupyter notebook使用opencv的例子_Python安装Jupyter Notebook配置使用教程
- 人脸识别技术如何应用到美颜领域?
- find 和 xargs 和 locate
- python所有变量更新_在python中,如何动态更新变量?
- MkDocs 文档编辑器
- 惯性积计算实例_关于材料力学中惯性矩的认识00
- C陷阱与缺陷--读书笔记3 语义“陷阱”
- Atitit 区块链之道 attilax著 艾龙著 1. 金融=制度+技术+信息	1 2. 第一章可信的协议	1 3. 第二章引导未来:区块链经济七大设计原则	1 4. 第五章 新商业
- 【OR】YALMIP 二次规划问题
- clientkey(ClientKeyt利用)
- 解决Mac苹果旧电脑、更换过硬盘时升级10.13以上系统提示“验证估计时发生错误”导致无法升级、u盘重装、改时间、官方版本也不行的问题
- python二元函数图像在线绘制_numpy,matplotlib
- java语言,MP3音频文件进行合并功能
- Python量化分析应该怎么做 ?
- Redis深入浅出—hash、set
- 【冬瓜哥画PPT】最完整的存储系统接口/协议/连接方式总结
- 消息传递,生产者消费者
热门文章
- 隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别
- 传感与检测技术,光电二极管和光敏电阻的特性研究实验报告,江南大学物联网工程学院自动化
- 台电+android+电话,通话系统_台电 G17s_平板电脑评测-中关村在线
- 5!(简单的了解for循环与递归的区别)
- Linux基础练习题(二)
- java对象的序列化机制详解
- C#经典名著:《C#入门经典》(第4版)
- mysql 数据迁移_MySQL海量数据迁移
- 性能优化CPU、内存、磁盘I/O、网络性能相关命令
- linux 线程管理、同步机制等