首页 > 解决方案 > 什么是正确的继承方式是带有初始化方法的JS

问题描述

我有这样的代码。它像我期望的那样工作。

class colorObj {
    constructor() {
        this.color = new Color();
    }
    init() {
        this.color.setColor(
            calcColor() // Could be long
        );
    }
}

class sizeObj extends colorObj {
    constructor() {
        super();
        this.size = new Size();
    }
    init() {
        super.init();
        this.size.setSize('10x10');
    }
}

let obj = new sizeObj();
obj.init(); // (1)
obj.color.setColor('green');
obj.init();

但现在我想删除第一个init()电话(1)。而且我不明白如何在类层次结构中调用它。我不能打电话this.init()colorObj因为new Size();还没有完成。主要思想是将构造函数中的对象分配与init()方法中的初始化分开。我也想有机会在任何有init()电话的地方“重置”对象。没有新的对象分配。

我可以用这样的代码做到这一点:

class sizeObj extends colorObj {
    constructor() {
        super();
        this.size = new Size();
        sizeObj.prototype.init.call(this, false);
    }
    init(initializeSuper = true) {
        if ( initializeSuper ) {
            super.init();
        }
        this.size.setSize('10x10');
    }
}

有用。但我希望找到不那么糟糕的解决方案。

我也可以这样做:

    class sizeObj extends colorObj {
        constructor() {
            super();
            this.size = new Size();
            this.initSizeObj();
        }
        init() {
            super.init();
            this.initSizeObj();
        }
        initSizeObj() {
            this.size.setSize('10x10');
        }
    }

但这对我来说也是纠结的解决方案。

谢谢 :)

标签: javascriptclassinheritance

解决方案


推荐阅读