Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

538
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!