Les Constructeurs en JavaScript (constructor)
En JavaScript, les constructeurs améliorent la création d’objets en chaîne.
Un constructeur est une fonction spéciale qui initialise des objets nouvellement créés.
Les constructeurs permettent de définir les propriétés et méthodes d’un objet, ce qui simplifie la création et la gestion des instances.
Comment Définir un Constructeur
Pour commencer, créons un constructeur simple. Utilisons une fonction pour définir le modèle de notre objet. Voici un exemple de code dans un éditeur de code :
function Personne(nom, age) {
this.nom = nom;
this.age = age;
}
const personne1 = new Personne('Martino', 20);
console.log(personne1.nom); // Affiche: Martino
console.log(personne1.age); // Affiche: 20
Dans cet exemple, Personne
est une fonction constructeur. Elle prend deux paramètres, nom
et age
, et les assigne aux propriétés de l’objet. L’utilisation du mot-clé new
crée une nouvelle instance de Personne
, initialisant ainsi alice
avec les valeurs spécifiées.
Comment Ajouter d’autres Méthodes aux Constructeurs
Les constructeurs ne se contentent pas d’initialiser des propriétés. Vous pouvez également leur ajouter des méthodes pour étendre leurs fonctionnalités. Voici comment faire :
function Personne(nom, age) {
this.nom = nom;
this.age = age;
}
Personne.prototype.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
const personne1 = new Personne('Samira', 25);
personne1.saluer(); // Affiche: Bonjour, je m'appelle Samira et j'ai 25 ans.
En utilisant Personne.prototype
, nous avons ajouté une méthode saluer
à toutes les instances créées avec ce constructeur. Cela montre comment les méthodes partagées peuvent être définies de manière efficace.
Quelles sont les Avantages des Constructeurs
Les constructeurs offrent plusieurs avantages. Ils permettent de centraliser la logique de création d’objets à la chaîne et assurent que chaque instance est initialisée de manière cohérente comme le constructeur a été défini.
Cela facilite également la maintenance et l’évolution du code en rendant les objets plus modulables et réutilisables.
Les Classes en JavaScript
Pour simplifier la syntaxe des constructeurs, JavaScript introduit les classes. Les classes offrent une manière plus moderne et intuitive de définir des constructeurs et des méthodes.
Voici un exemple utilisant les classes :
class Personne {
constructor(nom, age) {
this.nom = nom;
this.age = age;
}
saluer() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
}
}
const personne1 = new Personne('Xavier', 40);
personne1.saluer(); // Affiche: Bonjour, je m'appelle Xavier et j'ai 40 ans.
Les classes offrent une syntaxe plus lisible et structurée pour la création d’objets, ce qui peut être particulièrement utile dans des projets plus complexes.
Les Instances c’est quoi ?
Une instance en programmation, et plus particulièrement en JavaScript, est un objet concret créé à partir d’une classe ou d’un constructeur.
Lorsqu’une instance est créée, elle possède toutes les propriétés et méthodes définies par la classe ou le constructeur, mais elle a ses propres valeurs spécifiques.
Comment déclarer une instance ?
Déclarer une instance dans un constructeur signifie créer un nouvel objet basé sur ce constructeur. En JavaScript, cela se fait en utilisant le mot-clé new
suivi du nom du constructeur, qui est en fait une fonction. Le new
crée une instance de cet objet.
Voici les Étapes pour déclarer une instance
- Définir un constructeur : Créez une fonction qui servira de modèle pour les objets.
- Créer une instance : Utilisez
new
pour créer une instance de cet objet.
Exemple en JavaScript
Imaginons que vous avez un constructeur pour représenter une personne :
function Personne(nom, age) {
this.nom = nom; // Propriété nom de l'instance
this.age = age; // Propriété âge de l'instance
}
Dans ce cas, Personne
est un constructeur qui définit deux propriétés, nom
et age
.
Déclarer une instance de Personne
Pour créer une instance de Personne
, vous utiliseriez le mot-clé new
suivi du constructeur, et vous passez les arguments nécessaires :
const humain1 = new Personne('Trevor', 19);
Ici :
new Personne('Trevor', 19)
crée une nouvelle instance dePersonne
.- humain1est l’instance qui a été créée. Elle a ses propres valeurs pour
nom
('Trevor'
) etage
(19
).
Comment cela fonctionne exactement ?
Lorsque vous utilisez new
avec un constructeur :
- Création d’un objet vide : JavaScript crée un nouvel objet vide.
- Appel de la fonction constructeur : La fonction constructeur est appelée avec
this
lié à l’objet nouvellement créé. - Assignation des propriétés : Les propriétés et méthodes sont assignées à l’objet via
this
. - Retour de l’objet : L’objet nouvellement créé est automatiquement retourné par la fonction et assigné à la variable (dans notre exemple,
humain1
).
Ajouter une méthode via le prototype
Vous pouvez également ajouter des méthodes partagées à toutes les instances en utilisant le prototype du constructeur. Par exemple :
Personne.prototype.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
Personne
aura accès à la méthode saluer
:humain1.saluer(); // Affiche: Bonjour, je m'appelle Trevor et j'ai 19 ans.
new
suivi de la fonction constructeur.Comprendre l’Instance par une Analogie
Imaginez que vous avez un moule pour faire des gâteaux. Ce moule représente un « constructeur » ou une « classe ». Chaque gâteau que vous faites en utilisant ce moule est une instance.
Tous les gâteaux partagent la même forme, mais chacun peut avoir des décorations ou des garnitures différentes.
De la même manière, toutes les instances d’un objet partagent la même structure (propriétés et méthodes définies dans la classe ou le constructeur), mais elles peuvent avoir des valeurs différentes pour ces propriétés.
Exemple en JavaScript
Prenons un exemple simple en JavaScript avec un constructeur :
function Personne(nom, age) {
this.nom = nom;
this.age = age;
}
const personne1 = new Personne('Corinne', 30);
const personne2 = new Personne('Alberto', 25);
Dans cet exemple :
Personne
est un constructeur, une sorte de plan pour créer des objets.- personne1 est une instance de
Personne
. Elle a son proprenom
(Corinne) etage
(30). - personne2 est une autre instance de
Personne
. Bien qu’il soit créé à partir du même constructeur, il a son proprenom
(Alberto) etage
(25).
Caractéristiques des Instances
Propriétés Individuelles : Chaque instance a ses propres valeurs de propriété. Dans l’exemple ci-dessus,
personne1.nom
est « Corinne » etpersonne2.nom
est « Alberto ». Ces valeurs sont indépendantes les unes des autres.Méthodes Partagées : Si vous ajoutez une méthode via
Personne.prototype
, cette méthode sera partagée entre toutes les instances. Par exemple :
Personne.prototype.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
personne1.saluer(); // Affiche: Bonjour, je m'appelle Corinne et j'ai 30 ans.
personne2.saluer(); // Affiche: Bonjour, je m'appelle Alberto et j'ai 25 ans.
saluer
est accessible par toutes les instances (personne1
, personne2
, etc.), mais elle utilise les propriétés spécifiques de chaque instance.
personne2.age = 26;
console.log(personne2.age); // Affiche: 26
console.log(personne1.age); // Affiche: 30
Même après avoir changé l’âge de
personne2
, l’âge de personne1reste inchangé.
Pourquoi les Instances sont Importantes ?
Les instances permettent de créer plusieurs objets similaires mais distincts, chacun ayant ses propres données.
Cela est crucial dans les applications réelles où vous avez besoin de gérer et manipuler des données individuelles, comme des utilisateurs, des produits, ou des événements, tout en réutilisant la même logique de base pour leur création et leur gestion.
Une instance est donc une représentation concrète d’une classe ou d’un constructeur. Elle permet d’appliquer un modèle générique à des objets spécifiques, offrant flexibilité et efficacité dans la gestion de vos données en programmation.
Un point important à prendre en compte
Lors de l’ajout de méthodes à un constructeur en JavaScript, il est essentiel de comprendre la distinction entre les propriétés ajoutées directement à une instance d’objet et celles ajoutées via le prototype.
Cela a un impact direct sur l’efficacité et le comportement de votre code.
Pourquoi utiliser .prototype
pour ajouter une méthode ?
Lorsque vous ajoutez une méthode via .prototype
, vous ne stockez cette méthode qu’une seule fois dans la mémoire. Toutes les instances du constructeur partagent cette méthode.
Cela signifie que chaque objet créé avec ce constructeur a accès à la méthode via son prototype, mais n’a pas sa propre copie de la méthode. Voici un exemple pour illustrer ce point :
function Personne(nom, age) {
this.nom = nom;
this.age = age;
}
Personne.prototype.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
const alice = new Personne('Alice', 30);
const bob = new Personne('Bob', 25);
console.log(alice.saluer === bob.saluer); // Affiche: true
Dans cet exemple, alice
et bob
partagent la même méthode saluer
, car elle est définie sur Personne.prototype
. Cela économise de la mémoire, surtout si vous créez de nombreuses instances de Personne
.
Que se passerait-il si on ajoutait directement la méthode dans le constructeur ?
Si vous ajoutez une méthode directement à l’intérieur du constructeur, chaque instance aura sa propre copie de la méthode.
Cela peut être inefficace en termes de mémoire, surtout si la méthode est volumineuse ou si vous avez beaucoup d’instances. Voici un exemple pour illustrer cela :
function Personne(nom, age) {
this.nom = nom;
this.age = age;
this.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
}
const alice = new Personne('Alice', 30);
const bob = new Personne('Bob', 25);
console.log(alice.saluer === bob.saluer); // Affiche: false
alice
et bob
ont chacun leur propre copie de la méthode saluer
. Cela signifie que pour chaque nouvelle instance, JavaScript alloue de la mémoire pour cette méthode, ce qui peut rapidement devenir inefficace si vous créez de nombreux objets.Dans ce cas Pourquoi passer par prototype ?
Personne.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
Voici pourquoi cette méthode ne fait pas ce que vous pourriez attendre d’elle ?
Comprendre ce que fait Personne.saluer
Lorsque vous écrivez Personne.saluer = function() { ... }
, vous ajoutez la méthode saluer
directement à l’objet Personne
, qui est en fait une fonction (le constructeur lui-même).
Cette méthode n’est pas partagée par les instances créées par ce constructeur. Au lieu de cela, vous ajoutez une méthode statique au constructeur Personne
.
Cela signifie que la méthode saluer
est associée à la fonction Personne
et non aux instances créées par Personne
.
Par conséquent, la méthode saluer
n’est pas accessible à travers les objets créés par ce constructeur.
Exemple pour illustrer cette méthode :
function Personne(nom, age) {
this.nom = nom;
this.age = age;
}
// Ajout d'une méthode statique
Personne.saluer = function() {
console.log("Ceci est une méthode statique.");
};
const alice = new Personne('Alice', 30);
// Appel de la méthode statique
Personne.saluer(); // Affiche: Ceci est une méthode statique
// Tentative d'appel via une instance
alice.saluer(); // Erreur: alice.saluer is not a function
Dans cet exemple, Personne.saluer
est une méthode statique, ce qui signifie que vous pouvez l’appeler en utilisant Personne.saluer()
, mais elle n’est pas disponible pour les instances comme alice
.
Tenter d’appeler alice.saluer()
provoquera une erreur, car cette méthode n’existe pas sur l’objet alice
.
Donc Quelles sont les Différences clés entre ces méthodes :
Méthode statique (comme
Personne.saluer
) : Appartient au constructeur lui-même. Utilisée généralement pour des fonctions utilitaires qui ne nécessitent pas d’être liées à des instances particulières.Méthode d’instance (via
Personne.prototype.saluer
) : Accessible par toutes les instances créées par le constructeur. Elle est partagée entre toutes les instances, ce qui économise de la mémoire.Méthode spécifique à une instance : Définie directement dans le constructeur pour chaque instance, ce qui signifie que chaque objet a sa propre copie de la méthode.
Quelles sont les Avantages, Limites et Bonnes Pratiques avec les constructeurs ?
Les constructeurs en JavaScript sont une composante de la programmation orientée objet (POO) dans ce langage.
Ils permettent de créer et d’initialiser des objets avec un ensemble prédéfini de propriétés et de méthodes.
Cependant, comme toutes méthodes, ils viennent avec leurs avantages et leurs limites. Voici une analyse détaillée.
Avantages des Constructeurs
1. Encapsulation de la Logique de Création
Les constructeurs encapsulent la logique de création d’objets, ce qui rend le code plus facile a maintenir.
Vous définissez une fois la structure d’un objet, et chaque instance créée avec ce constructeur suit la même structure.
function Personne(nom, age) {
this.nom = nom;
this.age = age;
}
2. Code Réutilisable
Les constructeurs permettent de réutiliser la même logique pour créer plusieurs objets avec des données différentes. Vous pouvez créer des instances d’un même objet sans dupliquer le code.
const personne1 = new Personne('Vita', 30);
const personne2 = new Personne('Kathy', 25);
3. Prototypes pour Méthodes Partagées
En ajoutant des méthodes au prototype d’un constructeur, vous assurez que toutes les instances partagent la même méthode, économisant ainsi de la mémoire et évitant la duplication du code.
Personne.prototype.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
4. Création d’Objets Complexes
Les constructeurs facilitent la création d’objets complexes en combinant plusieurs propriétés et méthodes. Cela permet de structurer les objets de manière plus modulable et de gérer des fonctionnalités plus avancées.
Maintenant Quelles sont les Limites des Constructeurs
1. Pas de Vrai Encapsulation
Contrairement à certains autres langages orientés objet, JavaScript n’offre pas de véritable encapsulation des données dans les constructeurs. Les propriétés définies avec this
sont publiques et accessibles directement depuis l’extérieur de l’objet.
personne1.nom = 'Sofia'; // Cela modifie directement la propriété
2. Complexité avec l’Héritage
L’héritage en JavaScript, bien que possible avec les constructeurs, peut devenir complexe. Avant l’introduction des classes en ES6, l’héritage nécessitait des manipulations de prototype qui pouvaient rendre le code difficile à comprendre et à maintenir.
function Employe(nom, age, role) {
Personne.call(this, nom, age);
this.role = role;
}
Employe.prototype = Object.create(Personne.prototype);
Employe.prototype.constructor = Employe;
3. Performance et Mémoire
Si vous définissez des méthodes directement dans le constructeur au lieu d’utiliser le prototype, chaque instance aura sa propre copie de la méthode, ce qui peut gaspiller de la mémoire.
function Personne(nom, age) {
this.nom = nom;
this.age = age;
this.saluer = function() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
};
}
4. Confusion entre Fonctions Simples et Constructeurs
En JavaScript, les fonctions ordinaires et les constructeurs utilisent la même syntaxe. Si vous oubliez d’utiliser new
, JavaScript ne vous avertira pas et la fonction pourrait ne pas se comporter comme prévu.
const personne1 = Personne('Vita', 30); // Oublier 'new' crée un problème.
console.log(personne1); // Affiche: undefined
Bonnes Pratiques
1. Toujours Utiliser new
avec les Constructeurs et faire la Déclaration en PascalCase
Assurez-vous d’utiliser le mot-clé new
lorsque vous invoquez un constructeur pour éviter des comportements inattendus. Commencez par nommer votre constructeur en PascalCase , la première lettre débutant par une Majuscule exemple : (function Animal…)
2. Utiliser Object.freeze
pour des Objets Immuables
Si vous souhaitez rendre un objet immuable, vous pouvez utiliser Object.freeze
pour empêcher les modifications des propriétés
const personne1 = new Personne('Marc', 31);
Object.freeze(personne1);
personne1.age = 35; // Cette ligne n'aura aucun effet
3. Préférer les Classes pour une Syntaxe Plus Lisible
Depuis ES6, JavaScript introduit les classes, qui sont essentiellement du sucre syntaxique autour des constructeurs, mais offrent une syntaxe plus claire et plus structurée (voir article sur les classes).
class Personne {
constructor(nom, age) {
this.nom = nom;
this.age = age;
}
saluer() {
console.log(`Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`);
}
}
En résumé :
Les constructeurs en JavaScript sont puissants et permettent de créer plusieurs mêmes structure d’objets de manière simple et réutilisable.
Cependant, ils nécessitent une compréhension approfondie pour éviter les pièges potentiels tels que l’oubli de new
ou la mauvaise gestion de la mémoire.
En utilisant les bonnes pratiques et en combinant les constructeurs avec les classes introduites en ES6, tu peux écrire un code plus propre, plus maintenable et plus performant que ce soit au niveau de la charge mémoire et dans le script de ton programme pour ne pas dupliquer du code inutile.
Pour les développeurs avides de perfectionner leurs compétences en JavaScript, j’offre un bonus exclusif. Télécharge notre Guide gratuit « Avec plein de Secrets et d’astuces en JavaScript » pour découvrir des techniques et astuces supplémentaires qui amélioreront ton code et ton expertise.
Le Guide Bonus Exclusif
En allant plus loin, avec ce Guide Bonus Exclusif rien que pour Toi !
Voici un guide complet sur le JavaScript, où tu verras des techniques pour performer en programmation Js.
Ce guide te permettra de perfectionner tes compétences et de devenir un expert JavaScript. Ne le rate pas et développe ton expertise !
En adoptant ce qu’il contient, tu rends ton apprentissage de JavaScript plus performant avec une plus grande facilité tous les jours . Voici de quoi enrichir tout de suite ton savoir-faire ? Le guide complet t’attend !
Quelques liens en supplément de ce cours :
https://developpeur-pro.com/cours-javascript-les-bases
Rejoignez notre Newsletter et Restez Informé !
Vous souhaitez rester à jour avec les dernières tendances et actualités du monde du développement et le métier de développeur. Comment devenir développeur pro ? Rejoignez notre newsletter pour obtenir un accès exclusif à du contenu premium, des astuces de codage, des mises à jour sur les nouvelles fonctionnalités et bien plus encore !
Avantages de l’Inscription
- Restez Informé: Recevez des articles informatifs sur les dernières avancées et les meilleures pratiques de codage et les softkills.
- Promos Exclusives: Accédez à des formations détaillés et à des exemples de code pour améliorer vos compétences en programmation.
- Aperçus des Nouveautés: Soyez parmi les premiers à découvrir les nouvelles fonctionnalités et les frameworks émergents dans l’écosystème du développement FrontEnd et Backend.
- Communauté Engagée: Rejoignez une communauté passionnée de développeurs et partagez vos idées, questions et expériences.
Comment S’Inscrire
C’est simple et rapide ! Remplissez le formulaire d’inscription avec votre adresse e-mail et cliquez sur « S’Inscrire ». Vous recevrez régulièrement notre newsletter dans votre boîte de réception.
L’inscription à notre newsletter est un moyen idéal de rester informé et de progresser dans le domaine de la programmation et du développement pour devenir un développeur professionnel ou une développeuse pro.