2015-06-25 16 views
9

Facciamo, per esempio, una classe Dog:Perché la classe di wrapper TypeScript nella funzione anonima?

class Dog { 
    static food; 
    private static static_var = 123; 

    constructor(private name) {} 

    speak() { 
     console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var); 
    } 
} 

Redatto a JS:

var Dog = (function() { 
    function Dog(name) { 
     this.name = name; 
    } 

    Dog.prototype.speak = function() { 
     console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var); 
    }; 

    Dog.static_var = 123; 
    return Dog; 
})(); 

Questo funziona altrettanto bene ed è meno complicato:

function Dog(name) { 
    this.name = name; 
} 

Dog.prototype.speak = function() { 
    console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var); 
}; 

Dog.static_var = 123; 

C'è qualche (diverso da "estetico") motivo per l'utilizzo del wrapper della funzione anonima?

+0

'class' è un'espressione in dattiloscritto, non è vero? – Bergi

+0

Mi aspetto che limiti l'ambito di ciò che è definito all'interno della classe. – bhspencer

+0

sì, è per questo che l'ho etichettato come dattiloscritto. Bene, una parola chiave per essere esatta. – MightyPork

risposta

6

La differenza principale tra i due ha a che fare con hoisting.

TypeScript compila la classe in un'assegnazione di un'espressione di funzione a una variabile. Ciò significa che il costruttore risultante inizia a esistere solo nel punto di assegnazione. Nel codice che si verifica prima, Dog sarà associato a undefined.

D'altra parte, l'implementazione utilizza una funzione semplice soggetta a sollevamento: qualsiasi codice in tale ambito, incluso il codice che si verifica prima della funzione, può richiamare il costruttore Dog.

Immagino che TypeScript preferisca garantire che una classe non esista prima che sia effettivamente definita, probabilmente per consentire di ridefinire la classe in più punti nello stesso ambito.

+0

L'unica altra cosa che posso aggiungere a questo è che nelle classi grandi, non come quella fornita nella domanda, la minificazione comporterà un file più piccolo poiché tutte le variabili nella chiusura saranno ridotte. –

+0

@MichaelCoxon intendi variabili * private *, immagino? – MightyPork

+0

@ MightyPork si, e tutti i riferimenti al nome della classe –

Problemi correlati