2015-06-28 3 views
20

In ES6, beide von ihnen sind legal:Methods in ES6 Objekte: mit Pfeilfunktionen

var chopper = { 
    owner: 'Zed', 
    getOwner: function() { return this.owner; } 
}; 

und als Kürzel:

var chopper = { 
    owner: 'Zed', 
    getOwner() { return this.owner; } 
} 

Ist es möglich, die neuen Pfeilfunktionen sowie die Verwendung ? so etwas wie

var chopper = { 
    owner: 'John', 
    getOwner: => { return this.owner; } 
}; 

oder

var chopper = { 
    owner: 'John', 
    getOwner: => (this.owner) 
}; 

Ich erhalte eine Fehlermeldung darauf hindeutet, dass das Verfahren keinen Zugang zu this versuchen. Ist das nur ein Syntaxproblem, oder können Sie keine Fat-Pipe-Methoden in ES6-Objekten verwenden?

+5

Einer der größten Punkte der neuen Funktion Syntax war, dass es 'behandelt this' anders. Es wird durch die lexikalische Umgebung definiert, in der die Funktion erstellt wurde, was bedeutet, dass der "this" -Wert, in dem Sie die "chopper" -Variable erstellen, der "this" -Wert der Funktion ist. Mit anderen Worten, es wird nicht auf das "Zerhacker" -Objekt Bezug genommen. –

+0

habe ich es, gibt es eine Möglichkeit, diese Funktion neu zu schreiben, so dass es sich auf "Besitzer" im Chopper bezieht? – fox

+1

Bei Verwendung der Fettpfeilsyntax? Nur wenn Sie den 'this'-Wert ändern, indem Sie zuerst das' chopper'-Objekt erstellen, dann führen Sie die Zuweisung in einer Funktion durch, die 'this' auf dieses Objekt zeigt. Dies kann ziemlich sauber mit einer Konstruktorfunktion erreicht werden. –

Antwort

32

Pfeilfunktionen sind nicht dafür gedacht, in jeder Situation nur als eine kürzere Version von altmodischen Funktionen verwendet zu werden. Sie sollen die Funktionssyntax nicht mit dem Schlüsselwort function ersetzen. Der gebräuchlichste Anwendungsfall für Pfeilfunktionen ist ein kurzes "lambdas", das this nicht neu definiert und oft verwendet wird, wenn eine Funktion als Callback an eine Funktion übergeben wird.

Pfeil Funktionen können nicht Objektmethoden verwendet werden, zu schreiben, weil, wie Sie gefunden haben, da Pfeil Funktionen die this der lexikalisch einschließenden Funktionskontext übernehmen, ist die this innerhalb einer Objektdefinition entweder das Fenster oder etwas anderes:

Wenn Sie eine Methode für ein Objekt schreiben möchten, sollten Sie einfach den Standard function syntax oder die in ES6 eingeführten "Kurznamenmethodennamen" verwenden.

Es gab einige Diskussionen auf der Mailingliste es6 über eine Drehung auf Pfeilfunktionen, die ähnliche Syntax aber mit ihren eigenen this haben. Dieser Vorschlag wurde jedoch nur schlecht angenommen, da es sich um reine Syntaxzuckerung handelt, die es den Benutzern ermöglicht, die Eingabe einiger weniger Zeichen zu sparen, und keine neue Funktionalität gegenüber der vorhandenen Funktionssyntax bietet. Siehe Thema unbound arrow functions.

Ein früherer Vorschlag war Strichanzahl zu reduzieren, indem „prägnante Stellen“ mit, so dass Sie nicht zu haben, return zu schreiben, wie es in

var foo = { 
    function bar() this.baz 
        ^^^^^^^^ "concise body" 
} 

aber dies wurde parseability Gründen abgelehnt.

+0

Wenn ich das richtig lese, scheint es, dass die Mailing-Liste syntaktischen Zucker depriorisiert, auch wenn es zu größerer Einheitlichkeit/Lesbarkeit des Codes führen würde. So wie es aussieht, ist es viel schwieriger, die Fettpfeil-Funktionen in einem OOP-Kontext unter ES6 zu verwenden, als beispielsweise unter Kaffeescript. – fox

+0

Wie ich es verstehe, wird syntaktischer Zucker ** als ein berechtigter Grund für die Berücksichtigung von Spracherweiterungen angesehen, aber wie Sie sagen, mit einer niedrigeren Priorität - mit anderen Worten, der Balken ist höher für solche Vorschläge. –

5

In dieser Zeile getOwner: => (this.owner) sollte sein:

var chopper = { 
    owner: 'John', 
    getOwner:() => this.owner 
}; //here `this` refers to `window` object. 

würden Sie haben this in eine Funktion deklarieren:

var chopper = { 
    owner: 'John', 
    getOwner() { return this.owner } 
}; 

Oder:

var chopperFn = function(){ 
 

 
    this.setOwner = (name) => this.owner = name; 
 
    Object.assign(this,{ 
 
     owner: 'Jhon', 
 
     getOwner:() => this.owner, 
 
    }) 
 

 
} 
 

 
var chopper = new chopperFn(); 
 
console.log(chopper.getOwner()); 
 
chopper.setOwner('Spiderman'); 
 
console.log(chopper.getOwner());

+1

Ich erhalte hier einen Fehler: '" TypeError: Kann die Eigenschaft 'owner' von nicht definiertem \ n bei Object.chopper.getOwner' nicht lesen. – fox

+0

Ich sehe, es ist die richtige Verwendung, aber die Methode esta gibt immer das Fenster Objekt zurück müsste innerhalb einer Funktion 'this' deklarieren. –

+2

' this' bezieht sich nicht unbedingt auf 'window', sondern bezieht sich auf den aktuellen Wert von' this' in der umgebenden Umgebung, die 'window' sein kann oder auch nicht Vielleicht wollen Sie sichergehen, dass er versteht, dass es kein Standardwert ist. –