2015-07-31 11 views
7

Quando le funzioni dell'ES6 Arrow non sembrano funzionare per assegnare una funzione a un oggetto con prototype.object. Prendere in considerazione i seguenti esempi:Le funzioni freccia ES6 non funzionano sul prototipo?

function Animal(name, type){ 
this.name = name; 
    this.type = type; 
    this.toString =() => `${this.name} is a ${this.type}`; 

} 
var myDog = new Animal('Max', 'Dog'); 
console.log(myDog.toString()); //Max is a Dog 

Utilizzando la funzione freccia esplicitamente nelle opere di definizione dell'oggetto, ma utilizzando le funzioni di direzione con la sintassi Object.prototype non lo fa:

function Animal2(name, type){ 
    this.name = name; 
    this.type = type; 
} 
Animal2.prototype.toString =() => `${this.name} is a ${this.type}`; 

var myPet2 = new Animal2('Noah', 'cat'); 
console.log(myPet2.toString()); //is a undefined 

Proprio come un proof of concept , usando la sintassi stringa di modello con la sintassi Object.prototype funziona:

function Animal3(name, type){ 
    this.name = name; 
    this.type = type; 
} 
Animal3.prototype.toString = function(){ return `${this.name} is a ${this.type}`;} 

var myPet3 = new Animal3('Joey', 'Kangaroo'); 
console.log(myPet3.toString()); //Joey is a Kangaroo 

mi sto perdendo qualcosa di ovvio? Sento che l'esempio 2 dovrebbe funzionare logicamente, ma sono sconcertato dall'output. Immagino che sia un problema di scoping, ma sono scartato dall'output "è un indefinito".

ES6 Fiddle

+0

possibile duplicato di [funzione freccia/dichiarazione di funzione/espressioni: sono equivalenti/scambiabili?] (Http://stackoverflow.com/q/34361379/1048572) – Bergi

+2

@Bergi La mia domanda è stata pubblicata 10 mesi fa e ha 0 upvotes. Come potrebbe essere un duplicato di una domanda pubblicata 5 mesi fa, e perché è importante decidere adesso? –

+1

Qui non è stata assegnata alcuna colpa (avviso, inoltre, non ho chiuso la domanda ma ho pubblicato solo un commento). L'unica cosa importante è che i futuri lettori sono indirizzati al post canonico molto utile su questo argomento, ed è per questo che l'ho collegato. – Bergi

risposta

11

funzioni Freccia forniscono una lessicale this. Utilizza lo this disponibile al momento della valutazione della funzione.

E 'logicamente equivalente (il seguente codice non è valida in quanto non si può avere una variabile denominata this):

(function(this){ 
    // code that uses "this" 
})(this) 

Nel vostro primo esempio, la funzione di freccia è all'interno del costruttore, e this punta all'istanza appena generata.

Nel terzo esempio, una funzione di freccia non viene utilizzata e il comportamento standard this funziona come sempre (questo nell'ambito della funzione).

Nel tuo secondo esempio, si utilizza una funzione di freccia, ma per lo scopo viene valutato, this è globale/indefinito.

+0

Quindi non è possibile usarlo con le funzioni freccia al di fuori del costruttore (esempio 2)? –

+1

Puoi usarlo in qualsiasi posto dove 'questo 'è il' questo' che intendi che sia. Ad esempio, supponiamo che il tuo oggetto abbia una funzione 'setup()' che aggiunge più funzioni a se stessa, e lo chiameresti in questo modo: 'myObj.setup()'. Quella funzione potrebbe utilizzare le funzioni freccia per aggiungere le funzioni necessarie. Un altro caso di utilizzo più tipico è dove si utilizzano le funzioni di callback che devono accedere a "this" del contesto di avvio. – Amit

+3

* "Le funzioni di freccia forniscono un riferimento lessicale" * Più preciso sarebbe dire che le funzioni di freccia non forniscono un 'this', quindi invece che dal proprio ambito lessicale, proviene dall'ambito lessicale esterno. –