Lors de la construction d'une classe dans CoffeeScript, toute la méthode d'instance doit-elle être définie en utilisant => et toutes les méthodes statiques étant définies en utilisant ->?
Merci
Lors de la construction d'une classe dans CoffeeScript, toute la méthode d'instance doit-elle être définie en utilisant => et toutes les méthodes statiques étant définies en utilisant ->?
Merci
Non, ce n'est pas la règle que j'allais utiliser.
Les principaux cas d'utilisation j'ai trouvé pour la graisse-flèche dans la définition de méthodes (et c'est très fréquent dans notre base de code!) c'est quand vous voulez utiliser une méthode comme une fonction de rappel et que la méthode des références des champs d'instance:
class A
constructor: (@msg) ->
thin: -> alert @msg
fat: => alert @msg
x = new A("yo")
x.thin() #alerts "yo"
x.fat() #alerts "yo"
fn = (callback) -> callback()
fn(x.thin) #alerts "undefined"
fn(x.fat) #alerts "yo"
fn(-> x.thin()) #alerts "yo"
Comme vous le voyez, vous risquez de rencontrer des problèmes en passant une référence à une instance de la méthode de rappel si vous n'utilisez pas la graisse de la flèche. C'est parce que la graisse-flèche lie l'instance de l'objet à l' this
alors que la fine flèche ne l'est pas, si mince flèche méthodes appelées comme les rappels comme ci-dessus ne peuvent pas accéder à l'instance de domaines comme l' @msg
ou appeler d'autres méthodes d'instance. La dernière ligne, il y a une solution pour les cas où la fine flèche a été utilisé.
Généralement, ->
est fine.
class Foo
@static: -> this
instance: -> this
alert Foo.static() == Foo # true
obj = new Foo()
alert obj.instance() == obj # true
Notez comment la méthode statique de retour de l'objet de classe pour this
et l'instance retourne l'instance de l'objet pour this
.
Ce qui se passe est que l'invocation de la syntaxe est de fournir la valeur de this
. Dans ce code:
foo.bar()
foo
sera le contexte de l' bar()
fonction par défaut. Jusqu'à ce qu'il sorta fonctionne comme vous le souhaitez. Vous avez seulement besoin de la graisse de la flèche lorsque vous appelez ces fonction d'une autre manière qui n'utilise pas la syntaxe à point pour l'invocation.
# Pass in a function reference to be called later
# Then later, its called without the dot syntax, causing `this` to be lost
setTimeout foo.bar, 1000
# Breaking off a function reference will lose it's `this` too.
fn = foo.bar
fn()
Dans ces deux cas, l'utilisation d'une grosse flèche pour déclarer cette fonction permettrait à ceux du travail. Mais sauf si vous faites quelque chose de bizarre, vous n'avez généralement pas besoin.
Donc, utiliser l' ->
jusqu'à ce que vous avez vraiment besoin d' =>
et de ne jamais utiliser =>
par défaut.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.