Le funzioni freccia non sono progettate per essere utilizzate in ogni situazione semplicemente come una versione più breve di funzioni antiquate. Non intendono sostituire la sintassi della funzione utilizzando la functionparola chiave. Il caso d'uso più comune per le funzioni freccia è costituito da brevi "lambda" che non vengono ridefiniti this, spesso utilizzati quando si passa una funzione come callback a qualche funzione.
Le funzioni freccia non possono essere utilizzate per scrivere metodi oggetto perché, come hai scoperto, poiché le funzioni freccia si chiudono sul thiscontesto lessicale che lo racchiude, l' thisinterno della freccia è quello corrente nel punto in cui hai definito l'oggetto. Vale a dire:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
Nel tuo caso, volendo scrivere un metodo su un oggetto, dovresti semplicemente usare la functionsintassi tradizionale , o la sintassi del metodo introdotta in ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Ci sono piccole differenze tra loro, ma sono importanti solo se usi superin getOwner, cosa che non sei o se copi getOwnersu un altro oggetto.)
C'è stato un dibattito sulla mailing list es6 su una svolta nelle funzioni freccia che hanno una sintassi simile ma con la propria this. Tuttavia, questa proposta è stata accolta male perché si tratta di un semplice zucchero sintattico, che consente alle persone di risparmiare digitando alcuni caratteri e non fornisce nuove funzionalità rispetto alla sintassi delle funzioni esistenti. Vedere l'argomento Funzioni delle frecce non associate .
thisdiverso. È definito dall'ambiente lessicale in cui è stata creata la funzione, il che significa che ilthisvalore in cui crei lachoppervariabile sarà ilthisvalore della funzione. In altre parole, non farà riferimentochopperall'oggetto.