Estoy tratando de hacer que este código funcione correctamente:
class Reminder { constructor(text) { this.text = text; } remindMe(delay) { setTimeout(function() { console.log(`Your reminder after ${delay} seconds is: ${this.text}`); }, delay * 1000); } } //shows Reminder {text: "Hello World"} const example = new Reminder("Hello world"); //shows undefined console.log(example); // shows "Your reminder after 3 seconds is: undefined" console.log(example.remindMe(3)); Llevo mucho tiempo sin trabajar con clases, y sé que no está undefined porque el método remindMe no tiene acceso al constructor, porque no tiene getter. Pero traté de crear un getter y no me dejó llamarlo desde el método remindMe , traté de hacer algo como esto:
remindMe(delay) { setTimeout(function () { console.log(`Your reminder after ${delay} seconds is: ${getText()}); }, delay * 1000); }¿Alguna idea de dónde está el error? Gracias.
El método remindMe no está undefined porque no return nada, this.text está definido, porque this aquí se refiere a la window , debe bind con el objeto Reminder .
class Reminder { constructor(text) { this.text = text; } remindMe(delay) { setTimeout(function() { console.log(`Your reminder after ${delay} seconds is: ${this.text}`); }.bind(this), delay * 1000); } } //shows Reminder {text: "Hello World"} const example = new Reminder("Hello world"); //shows undefined console.log(example); // shows "Your reminder after 3 seconds is: undefined" console.log(example.remindMe(3));Es porque está utilizando una function como devolución de llamada en su intervalo, redefiniendo el contexto, por lo tanto, el valor de this .
Use arrow function en su lugar:
remindMe(delay) { setTimeout(() => { console.log(`Your reminder after ${delay} seconds is: ${this.text}`); }, delay * 1000); } El otro undefined proviene del hecho de que está imprimiendo el valor de retorno de remindMe pero no tiene ninguna palabra clave de return , por lo tanto, se devuelve undefined .
El example se está registrando en su código (como puede ver en el fragmento). Registra:
{ "text": "Hello world" } remindMe no devuelve nada explícitamente, por lo que el valor predeterminado es undefined (ese es el primer undefined en su salida). (Nota: dado que remindMe también es una función que contiene un tiempo de espera, aún no funcionaría porque está iniciando sesión de inmediato y la función solo se completa después de tres segundos. Además, contiene su propio console.log , por lo que no es necesario registrar el resultado. de llamar a la función de todos modos.)
this no funcionará como desea en ese setTimeout porque el contexto ha cambiado. En su lugar, use una función de flecha : no tienen this propio y "toman prestado" this de su entorno léxico externo.
class Reminder { constructor(text) { this.text = text; } remindMe(delay) { setTimeout(() => { console.log(`Your reminder after ${delay} seconds is: ${this.text}`); }, delay * 1000); } } const example = new Reminder("Hello world"); console.log(example); example.remindMe(3);