javascript - objetos - Objeto literal vs constructor+prototipo
prototype javascript ejemplos (1)
Existe una diferencia (fundamental, en mi opinión) entre los literales y las funciones de los objetos, las variables "privadas". Como un objeto no se puede instanciar (porque ya es una instancia de Object
), no tiene posibilidad de tener su propio (nuevo) ámbito . Es un concepto base de programación JS avanzada. Tener un nuevo alcance le permite hacer casi todo (puede declarar su propia window
, document
o lo que quiera excepto las palabras clave JS dentro de su propio alcance). Ahora, algunos ejemplos simples:
Supongamos que desea crear un gran número de instancias del mismo objeto (usando el menor número de líneas posible):
function MyObj(i) {
var privateCounter = "I am the instantiated object " + i + " .";
this.counter = function() {
return privateCounter;
};
}
var MyObjList = [],
ObjLitList = [];
for (var i = 0; i < 100; i++) {
MyObjList.push(new MyObj(i));
ObjLitList.push({counter: "I am the literal object number " + i + "."});
}
Ahora tiene 200 objetos que son casi , pero no precisamente , la misma cosa. Puede ampliarlos como prefiera, porque las funciones son objetos, pero en el caso de la función no puede acceder directamente a la variable private
. Veamos cuáles son las ventajas de una función:
- Se trata como un
Object
- Tiene su propio
Prototype
- Tiene variables privadas
Y el Object
s?
- Es un
Object
- No tiene su propio
Prototype
, pero puede declarar las funciones y extender el objeto mismo - No tiene variables privadas
Aparte de los vars privados, no son muy diferentes entre sí.
Veamos qué puede hacer el prototipo de una función:
MyObj.prototype.setX = function(x) {
this.x = x;
}
El uso del prototipo le permite crear una única instancia de una función anónima (que también se puede nombrar y luego asignar) que se compartirá entre instancias. ¿Cómo se puede hacer lo mismo con los literales de objeto?
function setX(x) {
this.x = x;
}
var obj = {
setX: setX
};
Como puede ver, tiene que crear el objeto que define cada vez una propiedad que es setX
. De lo contrario, puede extender Object.prototype
sí (pero hay un largo debate sobre la ampliación del prototipo de objetos JS nativos).
Entonces, ¿cuál es la mejor manera? No hay nadie, depende de lo que tiene que hacer, lo que necesita de su script, con cuál de los dos se siente más cómodo.
Prefiero escribir mis propias funciones y tratarlas como clases, porque son más fáciles de leer y puedo usar variables "privadas". Aunque no conozco a nadie que use literales en lugar de funciones.
En cuanto a las preguntas:
¿Cuál es la mejor forma de programación preferida (literales de objetos vs constructores vs prototipo)
Contestada.
se puede escribir un código con constructor y protoype utilizando solo literales de objeto sin usar constructor y protoype.
Sí, puede hacerlo si no necesita variables privadas (y si el script no es demasiado grande. Imagine que jQuery está escrito como un Object literal: D).
cuál es la significación de la función anónima
Oh, bueno, puedo responder con un ejemplo:
//code
myNamedFunction();
//code
function myNamedFunction() {
alert("I''m defined everywhere! :)");
}
Esto funciona y no generará un TypeError
.
myAnonymousFunction();
var myAnonymousFunction = function() {
alert("I''m defined after this declaration :(");
}
myAnonymousFunction(); // works!
Esto causará un Uncaught TypeError: undefined is not a function
, porque myAnonymousFunction
es solo una referencia a la función efectiva (que no tiene nombre, por lo que no se puede llamar desde el script).
Hay muchas cosas que decir sobre este argumento, y un buen punto para comenzar la programación avanzada es Javascript Garden . Otras buenas lecturas son Conceptos básicos de OOP en JS - NetTutsPlus , Trabajo con objetos - MDN y OOP en JS - Phrogz
¡Espero que esto ayude!
Sidenote: las funciones también tienen una buena ventaja ya que pueden cambiar su contexto ( this
) solo con una función ( call
por ejemplo), mientras que los objetos no pueden.
Object literal = pares de valores nominales envueltos en llaves.
Constructor = una función que se usa para crear múltiples instancias utilizando la palabra clave new.
Prototipo = para la extensión de un literal.
Esto es lo que he entendido hasta ahora. Pero cuanto más investigo, más me confundo sobre cuál es el significado de cada uno de ellos. He usado constructor, protoypes y literales en mi código algunas veces. Pero cada vez que los uso, siento que todavía no estoy al tanto de todo el potencial . Quiero ir un paso por delante de ser un begineer ahora. Espero que la gente en stackoverflow me ayude a lograrlo
¿Cuál es la mejor forma de programación preferida ( literales de objetos vs constructores vs prototipo )
se puede escribir un código con constructor y protoype utilizando solo literales de objeto sin usar constructor y protoype.
cuál es la significación de la función anónima
Un ejemplo muy simple que demuestre su importancia también servirá. Soy consciente de lo que son, pero no estoy al tanto de la posible magia que pueden hacer.