Al construir una clase en CoffeeScript, ¿se debe definir todo el método de instancia con el =>
operador ("flecha gruesa") y todos los métodos estáticos que se definan con el ->
operador?
coffeescript
arrow-functions
Ali Salehi
fuente
fuente
Respuestas:
No, esa no es la regla que usaría.
El principal caso de uso que he encontrado para la flecha gruesa en la definición de métodos es cuando desea utilizar un método como devolución de llamada y ese método hace referencia a campos de instancia:
Como puede ver, puede tener problemas para pasar una referencia al método de una instancia como devolución de llamada si no utiliza la flecha gruesa. Esto se debe a que la flecha gruesa une la instancia del objeto
this
mientras que la flecha delgada no lo hace, por lo que los métodos de flecha delgada llamados como devoluciones de llamada como los anteriores no pueden acceder a los campos de la instancia@msg
o llamar a otros métodos de instancia. La última línea es una solución alternativa para los casos en que se ha utilizado la flecha delgada.fuente
this
que se llamaría desde la flecha delgada, pero también las variables de instancia que obtendrías con la flecha gorda?this
establecido en una variable que quiero usar. Sin embargo, también quiero hacer referencia a un método de clase, por lo que también quierothis
hacer referencia a la clase. Solo puedo elegir entre una tareathis
, entonces, ¿cuál es la mejor manera de poder usar ambas variables?Un punto no mencionado en otras respuestas que es importante tener en cuenta es que las funciones de enlace con la flecha gruesa cuando no es necesario pueden conducir a resultados no deseados, como en este ejemplo con una clase que llamaremos DummyClass.
En este caso, las funciones hacen exactamente lo que uno podría esperar y no parece haber pérdida al usar la flecha gorda, pero qué sucede cuando modificamos el prototipo DummyClass después de que ya se haya definido (por ejemplo, cambiar alguna alerta o cambiar la salida de un registro) :
Como podemos ver anulando nuestra función del prototipo definida previamente, hace que alguna función se sobrescriba correctamente, pero otra función sigue siendo la misma en las instancias, ya que la flecha gorda ha provocado que otra función de la clase se vincule a todas las instancias, por lo que las instancias no volverán a su clase para encontrar una función
Incluso la flecha gorda no funcionará, ya que la flecha gorda solo hace que la función esté vinculada a nuevas instancias (que obtienen las nuevas funciones como cabría esperar).
Sin embargo, esto lleva a algunos problemas, ¿qué sucede si necesitamos una función (por ejemplo, en el caso de cambiar una función de registro a un cuadro de salida o algo así) que funcione en todas las instancias existentes (incluidos los controladores de eventos) [como tal que no podemos usar flechas gruesas en la definición original] pero aún necesitamos acceso a atributos internos en un controlador de eventos [la razón exacta por la que usamos flechas gruesas no flechas delgadas].
Bueno, la forma más sencilla de lograr esto es simplemente incluir dos funciones en la definición de clase original, una definida con una flecha delgada que realiza las operaciones que desea ejecutar y otra definida con una flecha gruesa que no hace más que llamar a la primera función por ejemplo:
Entonces, cuándo usar flechas delgadas / gruesas se puede resumir de manera bastante fácil de cuatro maneras:
Las funciones de flecha delgada solo deben usarse cuando se cumplen ambas condiciones:
Las funciones de la flecha de grasa sola deben usarse cuando se cumple la siguiente condición:
La función de flecha gruesa que llama directamente a una función de flecha delgada debe usarse cuando se cumplen las siguientes condiciones:
La función de flecha delgada que llama directamente a una función de flecha gruesa (no demostrada) debe usarse cuando se cumplen las siguientes condiciones:
En todos los enfoques, debe tenerse en cuenta en el caso en que las funciones del prototipo puedan cambiar si el comportamiento para instancias específicas se comportará correctamente, por ejemplo, aunque una función se define con una flecha gruesa, su comportamiento puede no ser coherente dentro de una instancia si llama un método que se cambia dentro del prototipo
fuente
Por lo general,
->
está bien.Observe cómo el método estático devuelve el objeto de clase para
this
y la instancia devuelve el objeto de instancia parathis
.Lo que sucede es que la sintaxis de invocación proporciona el valor de
this
. En este código:foo
será el contexto de labar()
función por defecto. Así que simplemente funciona como quieres. Solo necesita la flecha gruesa cuando llama a estas funciones de alguna otra manera que no use la sintaxis de puntos para la invocación.En ambos casos, usar una flecha gruesa para declarar esa función permitiría que esos funcionen. Pero a menos que esté haciendo algo extraño, generalmente no es necesario.
Así que úsala
->
hasta que realmente la necesites=>
y nunca la uses=>
por defecto.fuente
x = obj.instance; alert x() == obj # false!
=>
se necesitaría a en los métodos estáticos / de instancia de una clase.// is not a CoffeeScript comment
mientras que# is a CoffeeScript comment
.setTimeout foo.bar, 1000
"hacerlo mal"? Usar una flecha gorda es mucho mejor que usarsetTimeout (-> foo.bar()), 1000
IMHO.setTimeout
, por supuesto. Pero su primer comentario es algo artificial y no revela un caso de uso legítimo, sino que simplemente revela cómo podría romperse. Simplemente digo que no debe usar un a=>
menos que lo necesite por una buena razón, especialmente en los métodos de instancia de clase donde tiene un costo de rendimiento de crear una nueva función que debe estar vinculada a la creación de instancias.solo un ejemplo para resistir la flecha gorda
no funciona: (@canvas undefined)
funciona: (@canvas definidas)
fuente