Construí el objeto usando la clase ES6, creando la marca y la propiedad de velocidad de cualquier automóvil de la siguiente manera, y también puse un getter para convertir la velocidad en millas.
class CarCL { constructor(make, speed) { this.make = make; this.speed = speed; } // Converts current speed in mi/h get speedUS() { return (this.speed /= 1.6); } } const carFord = new CarCL('Ford', 120); console.log(carFord); console.log(carFord.speedUS);Obtuve un resultado extraño en la consola como la siguiente imagen.
¿Por qué la velocidad se convierte a 75 antes del método getter y luego continúa convirtiéndose a 46.875 y también nuevamente realizó cambios en el objeto CarCL.prototype a 29.296875, que es un prototipo de carFord?
El problema es esta línea:
return (this.speed /= 1.6); /= es una asignación de división , por lo que está diciendo efectivamente "establecer this.speed a su valor actual dividido por 1.6".
Un captador mutante es extremadamente confuso, como habrás notado. En su lugar, di return (this.speed / 1.6); y se comportará como cabría esperar.
En su getter speedUS() , está usando /= que asigna el resultado al operando izquierdo. Si no quiere eso (que presumiblemente no quiere), entonces cambie /= a solo / .
Cambia esto:
return (this.speed /= 1.6);a esto:
return (this.speed / 1.6);Tenga en cuenta también que todo el concepto de un getter que muta la propiedad que está obteniendo es generalmente malo (supongo que no fue su intención que mutara). Un getter no debe mutar. Es un captador. Usa un setter para mutar.
class CarCL { constructor(make, speed) { this.make = make; this.speed = speed; } // Converts current speed in mi/h get speedUS() { return (this.speed / 1.6); } } const carFord = new CarCL('Ford', 120); console.log(carFord); console.log(carFord.speedUS); Para agregar un punto adicional de explicación, también está viendo una rareza en cómo funciona console.log() en algunos navegadores. Usted pensaría que su código debería mostrar primero el objeto carFord sin modificar y, luego, y solo entonces, el getter carFord.speedUS modificaría el objeto. De hecho, si ejecuta su código en nodejs, eso es lo que ve.
Pero, en algunos navegadores, la evaluación y visualización de un objeto pasado a console.log() es "perezosa", lo que significa que no sucede de inmediato y, por lo tanto, el captador carFord.speedUS se ejecuta antes de que la consola carFord aunque no sea así. el orden de los enunciados. Esta es una rareza en la implementación de console.log() (visto regularmente en Chrome) y probablemente se deba a algunas optimizaciones de rendimiento para tratar de no ralentizar la ejecución más de lo necesario.
Si cambiaste tu código a esto:
const carFord = new CarCL('Ford', 120); console.log(JSON.stringify(carFord)); console.log(carFord.speedUS);A continuación, puede ver lo que espera:
{ "make": "Ford", "speed": 120 } 75 Por supuesto, todo esto es discutible si arreglas el getter speedUS() para no mutar el objeto.