Estoy tratando de convertir mis clases de JavaScript del estilo antiguo al nuevo estilo. El problema es que con el nuevo estilo, JavaScript requiere que en un constructor se llame a super antes de acceder a this . Tengo que extender una clase de la que no soy el propietario y en ese constructor llama a un método que sobrescribo donde uso mis propias propiedades. ¿Cómo resolver eso?
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') } }Haría que el prototipo create un no-op, y luego llamaría a una función después de que se haya realizado el 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' }); Supongo que también podría asignar a .create después de las superejecuciones, convirtiéndolo de no operativo a la funcionalidad deseada.
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' });Agregaría un protector en la create de B y haría que su constructor lo ejecutara nuevamente:
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();