• JavaScript设计模式之装饰器模式


    装饰器模式比继承更轻便,不改变原有对象的方法,在原有方法的前面或者后面添加一些点缀功能。

    1. ES6写法
    • 装饰class
    const logWrapper = targetClass => {
        const oldRender = targetClass.prototype.render
        targetClass.prototype.render = () => {
            console.log('before render')
            oldRender.apply(this)
            console.log('after render')
        }
        return targetClass
    }
    class App {
        constructor(title) {
            this.title = title
        }
        render() {
            console.log(`渲染页面${this.title}`)
        }
    }
    App = logWrapper(App)
    new App().render()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    1. typescript写法
    • 装饰class
    const logWrapper = targetClass => {
        const oldRender = targetClass.prototype.render
        targetClass.prototype.render = () => {
            console.log('before render')
            oldRender.apply(this)
            console.log('after render')
        }
        return targetClass
    }
    @logWrapper
    class App {
        constructor(title) {
            this.title = title
        }
        render() {
            console.log(`渲染页面${this.title}`)
        }
    }
    new App().render()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 装饰class的属性
    const logWrapper = (target, name, descriptor) => {
        console.log(arguments)
        let originRender = descriptor.value
        descriptor.value = function () {
            console.log('before render')
            originRender.bind(this)()
            console.log('after render')
        }
        console.log(target)
    }
    
    class App {
        constructor() {
            this.title = '饥人谷首页'
        }
        @logWrapper
        render() {
            console.log('渲染页面:' + this.title);
        }
    }
    new App().render()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    Apollo在NetCore实践
    Q-Learning
    day17-正则表达式作业
    c++game大全
    (十三)数据结构-树与二叉树的应用
    VB.NET媒体播放器PPT免费模板
    使用jmeter进行接口测试
    【数据结构】&&【C++】哈希表的模拟实现(哈希桶)
    sample-encoder-video报错
    un9.2:创建springboot的两种方式。
  • 原文地址:https://blog.csdn.net/m0_38102188/article/details/134185020