ES6如何处理超类中子类的静态属性

时间:2019-10-17 22:59:21

标签: javascript oop design-patterns ecmascript-6

class Line extends Shape {
    static howToDrag = { point: 0, update: 'xy' }
    static config = { color: 'white' }
    render() {
        console.log('render based on this.config', this.config)
    }
}

class Shape {
    constructor({ config }) {
        this.constructor.howToDrag = expandProperty1(this.constructor.howToDrag)
        this.config = config || this.constructor.config
    }
    drag() {
        console.log('drag based on this.constructor.howToDrag ', this.constructor.howToDrag)
    }

}

function expandProperty1({ point, update }) {
    if (typeof update === 'string') {
        return {
            point,
            update: {
                [point]: update
            }
        }
    }
}

这是代码,如果您可以理解我在做什么,请跳过以下说明,并提供一些有关使用OOP的更好方法的建议,因为从我的角度看,当前的实现非常合理。

查看http://canvas-chart.herokuapp.com/,了解我在做什么,我将解释上面的代码。

首先让我们谈谈静态属性configconfig应该属于每个实例,即每个实例都应该有自己的config,为什么我将其命名为static?原因是存在一些与config相关的通用逻辑,即它应该是从构造函数传递的值,否则,它具有默认值。通过将config设置为static,我可以在'Base'类中实现这种通用逻辑,而不必在每个Derived类中一遍又一遍地写它

另一个问题是howToDrag,它是真实的static。但是static由基类使用但在派生类中定义,这是正常现象吗?而且,派生类中的静态属性在基类中发生了突变。

当前是合乎逻辑的,但是我总是想知道这是否是进行OOP的方法,因为它依赖于this.constructor是派生类的基类指向这一事实。

0 个答案:

没有答案