He estado usando javascript por un tiempo, pero nunca aprendí el idioma pasado los conceptos básicos. Estoy leyendo "Pro Javascript Techniques" de John Resig - Tengo algunas preguntas, pero no las encuentro en el libro o en google, etc.Preguntas orientadas a objetos en Javascript
John da este ejemplo en su libro :
Función # 1
function User(name, age){
this.name = name;
this.age = age;
}
// Add a new function to the object prototype
User.prototype.getName = function(){
return this.name;
};
User.prototype.getAge = function(){
return this.age;
};
var user = new User("Bob", 44);
console.log("User: " + user.getName() + ", Age: " + user.getAge());
todavía estoy aprendiendo sobre la propiedad prototipo, así que traté de escribir algo similar:
Función # 2
function User (name, age) {
this.name = name;
this.age = age;
this.getName = function() {
return this.name;
};
this.getAge = function() {
return this.age;
};
}
var user = new User("Bob", 44);
console.log("User: " + user.getName() + ", Age: " + user.getAge());
que no utiliza el prototipo propiedad para crear las funciones getName y getAge, pero la salida es el mismo que el ejemplo de John.
Me tomó un paso más allá, y crearon esto:
Función # 3
var User = {
name: "",
age: 0,
setName: function(name) {
this.name = name;
},
setAge: function(age) {
this.age = age;
},
getName: function() {
return this.name;
},
getAge: function() {
return this.age;
}
};
User.setName("Bob");
User.setAge(44);
console.log("User: " + User.getName() + ", Age: " + User.getAge());
Una vez más - se ve diferente que el ejemplo de Juan (y he tenido que añadir métodos setter), pero la salida es el mismo.
Pregunta # 1 - ¿Cuál es la diferencia entre las 3 funciones? ¿Cuál es la ventaja de la propiedad del prototipo, y la Función n. ° 2 está haciendo algo incorrectamente, porque parece más sencillo codificar # 2 en lugar de # 1 (aunque estoy seguro de que # 1 lo está haciendo mejor cuando John lo creó). .
Pregunta n. ° 2 - ¿Cómo podría modificar la función n. ° 3 para no utilizar los métodos setName y setAge, pero aun así conservar la {...} abreviatura? ¿Puede la {...} taquigrafía tener constructores?
Gracias de antemano por ayudarme a aprender!
EDIT Creo que mi segunda pregunta fue un poco confusa. Me refiero a cómo podría utilizar el {...} taquigrafía para crear un objeto de usuario, pero luego después de crear el objeto, diga algo como:
var user = new User("Bob", 44);
Al igual que en la función # 1 - o es que no es posible ?
EDIT # 2 ¡Guau! Gracias a todos por las increíbles respuestas. Eso realmente lo hace mucho más claro para mí. Entonces, si entiendo correctamente, la diferencia entre # 1 y # 2 no es demasiado. Si solo alguna vez creo un objeto "Usuario", probablemente no sean diferentes en absoluto. Pero si mi programa crea muchos objetos de Usuario, lo más probable es que el # 1 sea más eficiente y use menos memoria ya que todos los objetos compartirán las mismas funciones.
Realmente aprecio todas las excelentes respuestas - ¡Gracias!
supongo que me refiero a la pregunta # 2 es ¿cómo puedo modificar la función # 3 para que yo pueda decir algo como var persona = new Usuario(); – BrianH
Este comentario no es del todo cierto 'Todas las diferentes funciones getName se comportan exactamente igual'. Tipo # 2 tiene acceso a vars privados – meouw
Mi punto es que se comportan igual en el ejemplo. – Glomek