Javascript 在调用 super 之前初始化 class 属性

Javascript init class properties before calling super

我正在尝试将我的 javascript class 从旧风格转换为新风格。问题是,新样式 JavaScript 要求在访问 this 之前调用构造函数 super。我必须扩展一个我不是其所有者的 class,并且在该构造函数中它调用一个方法,我在使用自己的属性的地方覆盖该方法。如何解决?

class A {
    constructor() {
        this.create()
    }

    create() {}

    reload() {
        this.create()
    }
}

class B extends A {
    constructor(options) {
        super()
        this.options = options
    }

    create() {
        let title = this.options.title // TypeError: Cannot read properties of undefined (reading 'title')
    }
}

我会将原型的 create 设为 no-op,然后在 super() 完成后调用一个函数。

class A {
    constructor() {
        this.create()
    }
    create() {}
}

class B extends A {
    constructor(options) {
        super()
        this.options = options
        this.createB();
    }

    createB() {
        const title = this.options.title;
        console.log(title);
    }
    create() {}
}

new B({ title: 'foo' });

我想你也可以在超级运行后分配给 .create,将它从 no-op 变回你想要的功能。

class A {
    constructor() {
        this.create()
    }
    create() {}
}

function createB() {
}
class B extends A {
    constructor(options) {
        super()
        this.options = options
        this.create = () => {
            const title = this.options.title;
            console.log(title);
        };
        this.create();
    }
    create() {}
}

new B({ title: 'foo' });

我会在 B 的 create 中添加一个守卫,并让它的构造函数再次执行它:

class A {
    constructor() {
        this.create();
    }

    create() {
        console.log("I don't want to run this");
    }

    reload() {
        this.create();
    }
}

class B extends A {
    constructor(options) {
        super();
        this.options = options;
        this.create(); // ... but now
    }

    create() {
        if (!this.hasOwnProperty("options")) return; // not now...
        let title = this.options.title;
        console.log("title", title);
    }
}

let b = new B({ title: "my title" });
console.log("let's reload");
b.reload();