Tengo un problema al llamar a super dentro del método estático secundario.
const _todos = []; class Todo { constructor(title) { this.title = title; this.id = Math.round(Math.random() * 100); _todos.push({title, id: this.id}); console.log(`Todo ID: ${this.id}. DONT FORGET IT!`); } static TodoerVersion = '1.8'; static removeTodo(id) { const todoIndex = _todos.findIndex(t => t.id == id); _todos.splice(todoIndex, 1); } } class TodoV2 extends Todo { static addTodo(title) { super(title); } static addDescription(todo, description) { todo.description = description; } static TodoerVersion = '2.0'; }; new TodoV2("play guitar"); Por que no funciona? Pero si llamo a super en el método normal, funcionaría bien.
super solo se puede llamar dentro de la función constructora de una clase.
Dos respuestas para ti:
La pregunta que realmente hiciste.
Lo que creo que deberías hacer en su lugar. :-)
JavaScript es muy especial en este sentido: this tiene un significado en los métodos static (siempre que los llame correctamente, por ejemplo, TodoV2.addTodo("title") ): es la función constructora en la que llamó al método estático. Y una función constructora de subclase hereda de su función constructora de superclase (sí, en serio). Entonces puede acceder a la función constructora para la clase principal usando Object.getPrototypeOf(this) en el método static :
// This is something unusual that JavaScript actually does support static addTodo(title) { const ctor = Object.getPrototypeOf(this); return new ctor(title); } Para manejar el caso en el que el usuario puede haber llamado a addTodo de una manera que no establece this , puede hacer algo como esto para TodoV2 de forma predeterminada si this está undefined :
static addTodo(title) { const ctor = Object.getPrototypeOf(this ?? TodoV2); return new ctor(title); } No deberías usar un método estático para esto. En su lugar, defina un constructor para TodoV2 :
class TodoV2 extends Todo { constructor(title, description) { super(title); this.description = description ?? ""; } static addTodo(title) { // Why no `description`? return new this(title); // Or `new TodoV2(title)` } } También puede consultar el patrón Symbol.species si desea que las subclases creen instancias de superclases.