J'utilise javascript depuis un certain temps, mais je n'ai jamais appris le langage au-delà des bases. Je suis en train de lire "Pro Javascript Techniques" de John Resig. Je me pose des questions, mais je ne trouve pas les réponses dans le livre ou sur Google, etc.
John donne cet exemple dans son livre :
Fonction 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());
Je suis toujours en train d'apprendre sur le prototype J'ai donc essayé d'écrire quelque chose de similaire :
Fonction 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());
Il n'utilise pas le prototype pour créer les fonctions getName et getAge, mais le résultat est le même que dans l'exemple de John.
Je suis allé un peu plus loin, et j'ai créé ceci :
Fonction 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());
Encore une fois, l'apparence est différente de celle de l'exemple de John (et j'ai dû ajouter des méthodes setter), mais le résultat est le même.
Question n° 1 - quelle est la différence entre les 3 fonctions ? Quel est l'avantage de la propriété prototype, et la fonction n°2 fait-elle quelque chose d'incorrect, parce qu'il semble plus direct de coder la n°2 au lieu de la n° 1 (bien que je sois sûr que la n° 1 le fait mieux, vu que John l'a créée).
Question n°2 - Comment pourrais-je modifier la fonction n° 3 pour ne pas utiliser les méthodes setName et setAge, tout en conservant l'abréviation {...} ? L'abréviation {...} peut-elle avoir des constructeurs ?
Merci d'avance de m'aider à apprendre !
EDITAR Je pense que ma deuxième question était un peu confuse. Je voulais dire que je pouvais utiliser le raccourci {...} pour créer un objet Utilisateur, mais après avoir créé l'objet, dire quelque chose comme :
var user = new User("Bob", 44);
Comme dans la fonction 1 - ou est-ce impossible ?
EDIT #2 Wow ! Merci à tous pour ces réponses géniales. Cela rend les choses beaucoup plus claires pour moi. Donc, si je comprends bien, la différence entre le numéro 1 et le numéro 2 n'est pas trop importante. Si je ne crée qu'un seul objet "Utilisateur", ils ne sont probablement pas différents du tout. Mais si mon programme crée de nombreux objets "User", le n°1 sera probablement plus efficace et utilisera moins de mémoire puisque tous les objets partageront les mêmes fonctions.
J'apprécie vraiment toutes les bonnes réponses - Merci !