jeudi 17 octobre 2019

How to handle static property of sub class in super class ES6

class Line {
    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
            }
        }
    }
}

Here is the code, If you can understand what I am doing, skip the following explanation and provided some suggestions on what is the better way to make use of OOP because the current implementation is pretty wired from my perspective.

Check out http://canvas-chart.herokuapp.com/ to see what I am doing and I will explain the code above.

Let us talk about the static property config first. config should belong to each instance, i.e. each instance should have its own config, why I put it as static? The reason is that there is some common logic related to config, i.e. it should be the value passed from the constructor, otherwise, it has the default value. By setting the config as static, I am able to implement such common logic in 'Base' class, rather than write it over and over again in each Derived class

The other concern is howToDrag, it is a real static.However the static is used by base class but defined in the derived class, is it a normal thing? What is more, the static property in the derived class is mutated in the base class.

The current make logical sense but I always wonder if it is the way to do OOP because it relies on the fact this.constructor is base class point to the derived class.

Aucun commentaire:

Enregistrer un commentaire