Metodos con prototype no soporta arrow functions?

Al intentar crear metodos prototype sobre el objeto Person me da error.

no se pueden utilizar arrow function al crear metodos prototype??


function Person(name, weight, height) {
    this.nombre = name
    this.weight = weight
    this.height = height
}

Person.prototype.greet = (name) => {
    return `Hola ${name}, me llamo ${this.nombre}`
}
Person.prototype.bmi = () => {
    return this.weight / this.height ** 2;
}

const pedro = new Person("Pedro", 72, 1.5)
console.log(pedro.greet("Maria")) // "Hola Maria, me llamo Pedro"
console.log(pedro.bmi()) // 32
Person.prototype.greet=function(name){
  return `Hola ${name}, me llamo ${this.nombre}`
}
```
creo que es porque no se puede usar asi no mas el tema del @funtion ,, ,fijate ,asi funcionaria...saludos

Si, es por algo que se llama el alcance léxico. En pocas palabras es por el this : con la función normal, this se refiere al objeto sobre el que se está invocando el método (hasta ahí bien), pero con la función flecha this se refiere a otra cosa.

Con la función flecha this se comporta de forma diferente manteniendo el valor que tenía this fuera de la función flecha.

Sí, this en JavaScript estuvo super mal diseñado y depende de la forma en que se invoque la función. Yo te diría por ahora que lo dejes como una función normal, pero si quieres más info sigue leyendo :wink:


En general, this se refiere al objeto actual (como hemos visto en el curso en los objetos literales y funciones constructoras). Pero si no hay un objeto “actual”, this depende del ambiente: en el navegador se refiere al objeto global window, en Node.js es undefined.

En una función normal el valor de this puede cambiar dependiendo de cómo se llame la función. Supongamos que tenemos el siguiente método hello que utiliza this dentro de un objeto:

const person = {
  name: "Pedro",
  hello: function hello() {
    console.log(this.name)
  }
}

Si invocamos el método hello sobre person el resultado es el esperado:

persona.hello() // "Pedro"

Pero uno puede cambiar el this en hello de varias formas al invocarlo, una de ellas es con el método call que recibe como primer argumento lo que uno quiere que sea this:

persona.hello.call({ name: "Maria" }) // "Maria"

En este ejemplo estoy cambiando el this para que sea un objeto que tiene una llave name con valor “María”.

Con las funciones flecha no hay forma de cambiar el this, que siempre se refiere al this que existía cuando se evalua la función. Esto es más predecible pero tiene la desventaja que no se puede utilizar en algunos casos, como en los métodos de objetos o funciones constructoras.

Nota: Al valor del this también se le conoce como el contexto.

2 Me gusta

@santi343 tienes razón, la implementación de la función flecha no se puede así no más. y funciona bien con la función normal tal cual como lo colocaste. muchas gracias!

Hola @germanescobar .

Pues veo que las implicaciones de implementar las funciones flecha son extensas. Pero con tu explicación ya me doy cuenta porqué no fue posible construir así el método. Excelente explicación, me solucionaste ese rollo que tenia en la cabeza. Muchas gracias!