Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

541
Vistas
¿Cómo extender una clase sin tener que usar super en ES6?

¿Es posible extender una clase en ES6 sin llamar al super para invocar la clase principal?

EDITAR: La pregunta puede ser engañosa. ¿Es el estándar al que tenemos que llamar super() o me estoy perdiendo algo?

Por ejemplo:

 class Character { constructor(){ console.log('invoke character'); } } class Hero extends Character{ constructor(){ super(); // exception thrown here when not called console.log('invoke hero'); } } var hero = new Hero();

Cuando no estoy llamando a super() en la clase derivada, tengo un problema de alcance -> this is not defined

Estoy ejecutando esto con iojs --harmony en v2.3.0

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Las reglas para las clases ES2015 (ES6) básicamente se reducen a:

  1. En un constructor de clases secundarias, this no se puede usar hasta que se llame a super .
  2. Los constructores de clases ES6 DEBEN llamar a super si son subclases, o deben devolver explícitamente algún objeto para tomar el lugar del que no se inicializó.

Esto se reduce a dos secciones importantes de la especificación ES2015.

La sección 8.1.1.3.4 define la lógica para decidir qué es this en la función. La parte importante para las clases es que es posible que this esté en un estado "uninitialized" , y cuando esté en este estado, intentar usar this arrojará una excepción.

Sección 9.2.2 , [[Construct]] , que define el comportamiento de las funciones llamadas a través de new o super . Al llamar a un constructor de clase base, this se inicializa en el paso #8 de [[Construct]] , pero para todos los demás casos, this no se inicializa. Al final de la construcción, se llama GetThisBinding , por lo que si aún no se ha llamado a super (inicializando así this ), o no se devolvió un objeto de reemplazo explícito, la línea final de la llamada al constructor generará una excepción.

over 4 years ago · Santiago Trujillo Denunciar

0

La nueva sintaxis de la clase es6 es solo otra notación para las "clases" es5 "antiguas" con prototipos. Por lo tanto, no puede instanciar una clase específica sin establecer su prototipo (la clase base).

Eso es como ponerle queso a tu sándwich sin hacerlo. Además no se puede poner queso antes de hacer el bocadillo, así que...

...usar this palabra clave antes de llamar a la superclase con super() tampoco está permitido.

 // valid: Add cheese after making the sandwich class CheeseSandwich extend Sandwich { constructor() { super(); this.supplement = "Cheese"; } } // invalid: Add cheese before making sandwich class CheeseSandwich extend Sandwich { constructor() { this.supplement = "Cheese"; super(); } } // invalid: Add cheese without making sandwich class CheeseSandwich extend Sandwich { constructor() { this.supplement = "Cheese"; } }

Si no especifica un constructor para una clase base, se usa la siguiente definición:

 constructor() {}

Para las clases derivadas, se utiliza el siguiente constructor predeterminado:

 constructor(...args) { super(...args); }

EDITAR: Encontré esto en developer.mozilla.org :

 When used in a constructor, the super keyword appears alone and must be used before the this keyword can be used.

Fuente

over 4 years ago · Santiago Trujillo Denunciar

0

Ha habido múltiples respuestas y comentarios que indican que super DEBE ser la primera línea dentro del constructor . Eso es simplemente incorrecto. La respuesta de @loganfsmyth tiene las referencias requeridas de los requisitos, pero se reduce a:

El constructor heredado ( extends ) debe llamar a super antes de usar this y antes de regresar, incluso si this se usa

Vea el fragmento a continuación (funciona en Chrome...) para ver por qué podría tener sentido tener declaraciones (sin usar this ) antes de llamar a super .

 'use strict'; var id = 1; function idgen() { return 'ID:' + id++; } class Base { constructor(id) { this.id = id; } toString() { return JSON.stringify(this); } } class Derived1 extends Base { constructor() { var anID = idgen() + ':Derived1'; super(anID); this.derivedProp = this.baseProp * 2; } } alert(new Derived1());

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda