prototypes classes javascript class prototype iife

javascript - classes - Crear una clase JS: IIFE vs volver prototipo



javascript prototypes (1)

El segundo ejemplo de código es la forma correcta de lograr lo que está buscando. Crea una función de ejecución inmediata, dentro de la cual crea una nueva función, la agrega a su prototipo y luego la devuelve.

El primer ejemplo es un poco extraño, y no crea una función constructora adecuada. La línea

return Car.prototype; // return with prototype

hace que su función Car simplemente devuelva siempre el objeto literal que había asignado previamente a Car.prototype . Esto anula el comportamiento normal de una función invocada con una new

Sólo una cosa a tener en cuenta, esta línea:

Car.prototype = { newColor: function(color) { private.color = color }, getColor: function() { return private.color } };

hará que la propiedad del constructor de los objetos recién creados ya no apunte a la función Car. Hay dos formas fáciles de solucionar esto si esto es importante para usted.

Car.prototype = { newColor: function(color) { private.color = color }, getColor: function() { return private.color } }; Car.prototype.constructor = Car; // <-------- add this line

O cambiar lo anterior a

Car.prototype.newColor = function(color) { private.color = color }; Car.prototype.getColor = function() { return private.color };

Veamos dos ejemplos en los que trataré de explicar lo que quiero entender.

var Car = function(){ // Init class function Car() { }; // Private func/vars var private = { color:''red'' }; // Public func/vars Car.prototype = { newColor: function(color) { private.color = color }, getColor: function() { return private.color } }; return Car.prototype; // return with prototype }; var myCar = new Car();

Y:

var Car = (function(){ // Init class function Car() { }; // Private func/vars var private = { color:''red'' }; // Public func/vars Car.prototype = { newColor: function(color) { private.color = color }, getColor: function() { return private.color } }; return Car; // avoid prototype adding parentheses on next line; })(); var myCar = new Car();

¡A ver !, ambas clases se crean como expresión de función y ambas funcionan por igual. Las únicas diferencias entre ellos son: La primera devuelve la función Car con su propiedad prototipo. El segundo funciona devolviendo la función Auto, evitando la propiedad del prototipo y en su lugar utiliza IIFE.

¿Cuál es la diferencia entre el uso return Car.prototype; y evitar el IIFE y usar el return Car; utilizando IIFE (paréntesis al final de la declaración de clase).