sintaxis - map javascript
¿Las funciones de flecha ES6 no funcionan en el prototipo? (1)
Cuando las funciones de flecha ES6 no parecen funcionar para asignar una función a un objeto con prototype.object. Considere los siguientes ejemplos:
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
Usar la función de flecha explícitamente en la definición del objeto funciona, pero usar las funciones de flecha con la sintaxis Object.prototype no:
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
Solo como prueba de concepto, el uso de la sintaxis de cadena de plantilla con la sintaxis Object.prototype funciona:
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
¿Me estoy perdiendo algo obvio? Siento que el ejemplo 2 debería funcionar lógicamente, pero la salida me desconcierta. Supongo que es un problema de alcance, pero la salida ''me resulta indefinido''.
Las funciones de flecha proporcionan un léxico
this
.
Utiliza
this
que está disponible en el momento en que se evalúa la función.
Es lógicamente equivalente a (lo siguiente no es un código válido ya que no puede tener una variable llamada
this
):
(function(this){
// code that uses "this"
})(this)
En su primer ejemplo, la función de flecha está dentro del constructor, y
this
apunta a la instancia recién generada.
En su tercer ejemplo, no se usa una función de flecha y el comportamiento estándar de
this
funciona como siempre (esto en el alcance de la función).
En su segundo ejemplo, utiliza una función de flecha, pero en el alcance que se evalúa,
this
es global / indefinido.