• 为对象添加新功能
  • 不改变原有的结构

其实就是对类、组件的功能增强:

  1. class Circle {
  2. draw() {
  3. console.log('画圆形'
  4. }
  5. }
  6. class Decorator {
  7. constructor(circle) {
  8. this.circle = circle
  9. }
  10. draw() {
  11. this.circle.draw()
  12. this.bordered()
  13. }
  14. bordered() {
  15. console.log('话边框')
  16. }
  17. }
  18. let circle = new Circle()
  19. let newCirle = new Decorator(circle)
  20. newCircle.draw() // 增强了原有draw函数的功能,但是又没有改变原有类的功能

举例:

  • ES7装饰器
  • core-decorators

1、如果想使用ES7的装饰器功能,需要安装babel插件 babel-plugin-transform-decorators-legacy,然后配置babel.rc文件

  1. {
  2. "presets": ["es2015", "latest"],
  3. "plugins": ["transform-decorators-legacy"]
  4. }

2、装饰器装饰类原理

  • 装饰器传参 ```javascript function testDec(isDec) { return function(target) { // target就是被装饰的对象
    1. target.isDec = isDec
    } }

@testDec(true) // 装饰器可以传参数 class Demo{}

const demo = new Demo() console.log(demo.isDec) // true

  1. - 模拟mixins实现
  2. ```javascript
  3. function mixins(...list) {
  4. return function (target) {
  5. Object.assign(target.prototype, ...list)
  6. }
  7. }
  8. const Obj1 = {
  9. fun1() {
  10. console.log('fun1')
  11. }
  12. }
  13. @mixins(Obj1) // 利用原型链扩展
  14. class TargetClass {}
  15. let obj = new TargetClass()
  16. obj.fun1() // fun1

3、readOnly实现

  1. function readonly(target, name, descriptor) {
  2. // descriptor 属性描述对象 在object.defineProperty中经常用到,默认值如下
  3. // {
  4. // value: 'sepcifiedFunction', // 就是属性的值,默认 undefined
  5. // enumerable: false, // 决定 for in 或 Object.keys 能否枚举该属性
  6. // get: // 访问器函数(getter),函数或 undefined,在取属性值时被调用
  7. // set: // 设置器函数(setter),函数或 undefined,在设置属性值时被调用
  8. // configurable: true, // 决定该属性能否被删除,以及除 value 和 writable 外的其他特性是否可以被修改
  9. // writable: true // 决定属性能否被赋值
  10. // }
  11. descriptor.writable = false
  12. return desctiptor
  13. }

4、log装饰器实现

  1. function log(target, name, descriptor) {
  2. const oldValue = descriptor.value
  3. descriptor.value = function() {
  4. console.log(`Calling ${name} with`, arguments)
  5. oldValue.apply(this, arguments)
  6. }
  7. return descriptor
  8. }

5、第三方库 core-decorators

  • deprecate

6、验证

将现有的对象和装饰器进行分离,两者独立
符合开放封闭原则