定义: 在不改变原对象的基础上, 通过对其进行包装拓展, 使原对象可以满足用户的更复杂需求
面向切面编程(AOP)思想的实现
ES7 装饰器简介
装饰器是 ES7 的新语法, 只能作用于类和类方法
// 类装饰器
function classDecorator(target) {
target.hasDecorator = true
return target
}
const { sleep } = require('sleep')
@classDecorator
class Button {
@funcExecTime
onClick() {
console.log('button onclick event')
sleep(1)
}
}
console.log('Button 是否被装饰: ', Button.hasDecorator)
/*
属性描述对象
descriptor {
value: [Function: onClick],
writable: true,
enumerable: false,
configurable: true
}
*/
// 类方法装饰器, 打印方法执行时间
function funcExecTime(target, name, descriptor) {
let originalMethod = descriptor.value
descriptor.value = function() {
console.log(name, '被装饰')
console.time(`方法: ${name}, 执行时间`)
originalMethod.apply(this, arguments)
console.timeEnd(`方法: ${name}, 执行时间`)
}
return descriptor
}
const btn = new Button()
btn.onClick()
// 需使用 babel 编译: babel Decorator.js --out-file babel_decorator.js
// node babel_decorator.js
/* 输出
Button 是否被装饰: true
onClick 被装饰
button onclick event
方法: onClick, 执行时间: 1.002s
*/
babel 编译装饰器语法
yarn global add babel-cli
yarn add -D babel-preset-env babel-plugin-transform-decorators-legacy
.babelrc
配置{
"presets": ["env"],
"plugins": ["transform-decorators-legacy"]
}
执行编译
babel Decorator.js --out-file babel_decorator.js