2015-04-09 7 views
5

In altre parole, questi due diversi blocchi di codice sono completamente equivalenti?La classe ES6 è completamente equivalente all'estensione basata su Object.assign di un oggetto?

ES6 classe estendere basa

class Child extends Parent { 
    // Define my subclass 
} 
var myInstance = new Child(); 

Object.assign basato

var myInstance = Object.assign(new Parent(), { 
    // Define my subclass 
} 

Nel mio particolare caso d'uso che sto cercando di estendere (di Facebook) Flux Dispatcher. Nei loro esempi usano Object.assign. Vorrei estendere la classe ES6, ma sono preoccupato che ci siano sottili differenze tra i due, quindi dovrei attenermi a Object.assign.

+1

Ci sono delle differenze, ma la domanda è se l'affetto. Per esempio. nel primo caso si ha 'myInstance instanceOf Child === true', che ovviamente non è il caso nel secondo esempio. –

+0

Immagino che intenda questo esempio di dispatcher: https://github.com/facebook/flux/blob/master/docs/TodoList.md –

+0

Sì, questo è il codice di esempio che stavo guardando. – misterwilliam

risposta

2

No, questi blocchi di codice non sono equivalenti

Nell'esempio di ereditarietà di classe si otterrà un nuovo costruttore che rende gli oggetti con caratteristiche di classe superiore.

L'estensione di oggetti tramite Object.assign è un esempio di mixins. Basta aggiungere alcune proprietà a un'istanza ma non modificare tutti i bambini futuri.

A differenza delle classi figlio, un'istanza dopo l'estensione avrà ancora la proprietà constructor che punta allo Parent. Significa che non è possibile riconoscere il figlio esteso tra non estesi, poiché tutti hanno lo stesso costruttore e operatore. instanceof darà lo stesso risultato. Inoltre non puoi accedere ai metodi sovrascritti in child, perché perderai il link ad esso.

Come per il dispatcher del flusso in this example, non è possibile estenderlo tramite l'ereditarietà della classe, poiché non esiste un costruttore che è possibile fornire come genitore.

Problemi correlati