Los constructores en JavaScript también son diferentes de otros idiomas. Cualquier función llamada a través de la palabra clave nueva puede considerarse como un constructor.
Dentro del cuerpo del constructor, esto apunta al objeto recién creado. Si no se muestra la expresión de retorno en el cuerpo del constructor, entonces lo devolveremos de forma predeterminada, es decir, el objeto recién creado.
La copia del código es la siguiente:
función foo () {
this.bla = 1;
}
Foo.prototype.test = function () {
console.log (this.bla);
};
VAR test = new foo ();
El código anterior llama a Foo como el constructor y señala el prototipo del objeto recién creado (__proto__) a foo.prototype.
Si definimos la expresión devuelta en el constructor, el constructor devolverá toda la expresión, pero esta expresión de retorno debe ser un objeto.
La copia del código es la siguiente:
Function Bar () {
regresar 2;
}
nuevo bar (); // un nuevo objeto
función test () {
this.value = 2;
devolver {
Foo: 1
};
}
nueva prueba (); // El objeto devuelto
Si se omite nuevo, la función no puede devolver un nuevo objeto.
La copia del código es la siguiente:
función foo () {
this.bla = 1; // se establece en el objeto global
}
Foo (); // indefinido
El ejemplo anterior también puede funcionar en algunos escenarios, pero debido al mecanismo de trabajo de esto en JavaScript, esto apuntará al objeto global aquí.
Modelo de fábrica
Para poder usar la palabra clave nueva, el constructor deberá mostrar un valor de retorno.
La copia del código es la siguiente:
Function Bar () {
valor var = 1;
devolver {
Método: function () {
valor de retorno;
}
}
}
Bar.prototype = {
foo: function () {}
};
nuevo bar ();
Bar();
En el ejemplo anterior, el efecto de llamar a la barra de funciones sin usar nuevo es el mismo, y se devolverá un objeto recién creado el método, que en realidad es un cierre.
Una cosa a tener en cuenta aquí es que New Bar () no devolverá Bar.Prototype, sino que será un objeto prototipo del método de función dentro de la expresión de retorno.
En el ejemplo anterior, no hay diferencia en la funcionalidad entre usar nuevos o no.
Crear nuevos objetos a través del modo de fábrica
A menudo se nos recuerda que no usemos nuevos porque una vez que se olvide de su uso, causará errores.
Para crear un objeto, preferimos usar el patrón de fábrica y construir un nuevo objeto dentro del patrón de fábrica.
La copia del código es la siguiente:
función foo () {
var obj = {};
obj.value = 'blub';
var private = 2;
obj.somemethod = function (valor) {
this.Value = value;
}
obj.getPrivate = function () {
regreso privado;
}
regresar obj;
}
Aunque el código de ejemplo anterior es menos propenso a los errores que cuando se usa nuevo y será más conveniente cuando se use variables privadas, hay algunas desventajas:
Debido a que los objetos prototipo no se pueden compartir, se requiere más memoria.
Para lograr la herencia, el patrón de fábrica requiere copiar todos los métodos de otro objeto o usarlo como un prototipo de un nuevo objeto.
Renunciar a la cadena prototipo es evitar el uso de nuevo, lo que parece ser contrario al espíritu del lenguaje JavaScript.
Resumir
Aunque usar nuevo puede ser más propenso a los errores, esta no es una razón para abandonar el uso de cadenas prototipo. En cuanto a qué método tomar al final, depende de las necesidades de la aplicación. La mejor manera es elegir un estilo y seguirlo.
En pocas palabras, el constructor es inicializar un objeto de instancia, y la propiedad prototipo del objeto hereda un objeto de instancia.