2015-10-27 9 views
7

Quando si esegue il seguente codice su Node.js 4.2.1:È possibile ereditare la classe vecchio stile dalla classe ECMAScript 6 in JavaScript?

'use strict'; 
 

 
var util = require('util'); 
 

 
class MyClass { 
 
    constructor(name) { 
 
    this.name = name; 
 
    } 
 
} 
 

 
function MyDerived() { 
 
    MyClass.call(this, 'MyDerived'); 
 
} 
 

 
util.inherits(MyDerived, MyClass); 
 

 
var d = new MyDerived();

ottengo il seguente errore:

constructor(name) { 
     ^

TypeError: Class constructors cannot be invoked without 'new' 

mi chiedo se è a tutto il possibile per ereditare le "classi" JavaScript vecchio stile dalle classi ECMAScript 6? E, se possibile, allora come?

risposta

7

Non c'è davvero una via d'uscita una volta che hai optato per la sintassi class.

Il problema è che l'ereditarietà in ES6 è fatto da tardo-inizializzazione la parola chiave this con il valore restituito da super(), che è una chiamata al costruttore come con new. Il vecchio idioma di "applicare" (.call()) il costruttore padre sull'istanza figlio attualmente "non inizializzata" fa non funziona più.

Che cosa si può ancora fare è quello di ricorrere a "eredità parassitaria" - dovrete costruire in modo esplicito l'istanza, estenderlo, e return è:

function MyDerived() { 
    var derived = new MyClass('MyDerived'); 
    … // set up properties 
    return derived; 
} 

Quando si esegue questa operazione con new MyClass, è tuttavia non sarà possibile configurare correttamente il prototipo. Per questo, è necessario utilizzare la nuova funzione ES6 Reflect.construct, che prende la classe bambino come un terzo parametro opzionale:

function MyDerived() { 
    var derived = Reflect.construct(MyClass, ['MyDerived'], new.target||MyDerived); 
    … // set up properties 
    return derived; 
} 

Questo ha il vantaggio aggiuntivo che MyDerived non ha bisogno di essere chiamato con new più (purché forniate MyDerived quando new.target è vuoto).

Problemi correlati