从 javaScript 看装饰模式

94 阅读1分钟

使用场景

由于开闭原则和里氏替换原则的约束,我们尽量不能通过重写改变继承对象的方法,也尽量少的修改原对象的方法。这时候装饰模式就派上用场了。

装饰模式

装饰模式是保持原有的行为的情况下,新增其他行为。装饰器属于装饰模式的一种实践,语言提供了原生的支持。

最简单的实践方法是在 Function 的原型上挂装饰方法,因为所有的函数都能访问到 Function 的原型上的东西。

    Function.prototype.decorate = function (fn) {
        // 惰性执行,同时提供链式调用
        return () => {
            this()
            fn()
        }
    }

使用方法:

    class Dog {
        sayHello() {
            console.log('hello')
        }
    }
    
    function wagTail () {
        console.log('tail')
    }
    
    const dog = new Dog()
    dog.sayHello.decorate(wagTail)()

有了装饰模式就能很方便的扩展功能。如果想提供更多样的功能的话,可以封装一个创建装饰模式的函数。