【问题标题】:Konvajs and similar design pattern(s) in TypeScriptTypeScript 中的 Konvajs 和类似的设计模式
【发布时间】:2018-02-24 09:31:43
【问题描述】:

我一直在研究 konvajs (https://github.com/konvajs/konva) 的源代码,我对设计模式很着迷,例如。 src/shape.js (https://github.com/konvajs/konva/blob/master/src/Shape.js):

    Konva.Shape = function(config) {
      this.__init(config);
    };

    Konva.Util.addMethods(Konva.Shape, {
    __init: function(config) {
    this.nodeType = 'Shape';
    \\ more code

这里似乎Shape 类的构造函数将参数'config' 传递给尚未声明的__init 方法。 __init 方法也通过 Util 方法 addMethods 添加到类中。对我来说,这似乎是一种灵活的编码方式,也就是说,如果您想添加一些新功能,实用程序类会为您处理它。

此外,定义属性的默认值是由工厂类添加的(例如,参见 shape.js 的底部)。

所以我的问题是:

是否可以在 typescript 中实现类似的设计模式?还是这种设计模式不适用于 OOP 语言(或任何打字稿)。

【问题讨论】:

    标签: typescript design-patterns konvajs


    【解决方案1】:

    如果你要在构造函数中调用方法,那么你应该在类声明中添加方法。如果有时您忘记调用所需的 addMethod util 会怎样?

    无论如何,如果你真的需要动态添加方法到类(我无法想象为什么),你可以使用类似this

    interface IInitializable {
        __init?(config);
    }
    function addInitializer<T>(obj: T, init): T & IInitializable {
        let initializable = obj as T & IInitializable;
        initializable.__init = init;
        return initializable;
    }
    
    class Shape {
        foo() {            
        }
    }
    
    function init(shape: IInitializable) {
        shape.__init("Hello there");
    }
    let shape = new Shape();
    let initializableShape = addInitializer(shape, 
        function (config) {
            alert(config)
        });;
    init(initializableShape);
    

    另外,您可以使用TypeScript mixins

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多