Ah, les objets JavaScript…
Certains jours, on les voit juste comme des conteneurs de données, mais en réalité, chacun possède un ADN caché : la chaîne de prototypes. 😎
Dans cet article, nous explorerons :
- Comment les objets fonctionnent réellement
- Les super-pouvoirs secrets des prototypes
- La mécanique des constructors et des classes
- Astuces pratiques et pièges courants
…et tout cela sans ennui, promis !
1️⃣ Qu’est-ce qu’un objet et pourquoi est-ce important ? 🧐
En JavaScript, presque tout peut être un objet :
- Données
- Fonctions
- Presque tout le reste !
const person = {
name: "Alice",
age: 25,
hobbies: ["coding", "coffee", "memes"]
};
console.log(person.name); // Alice
console.log(person.hobbies[2]); // memes
Explication amusante :
person.name→ le nom d’Aliceperson.hobbies→ les hobbies secrets d’Alice- Les objets JS peuvent stocker à la fois des données et des comportements
💡 Astuce : Les objets sont parfaits pour garder les données et les comportements ensemble. Comme Morpheus dans Matrix :
“Les objets peuvent te fournir des données ou des méthodes — choisis ce dont tu as besoin.” 😆
2️⃣ Prototype : L’ADN Caché des Objets 🧬
Les objets ne regardent pas seulement leurs propres propriétés ; ils consultent leur chaîne de prototypes.
- Si une propriété n’est pas sur l’objet lui-même, JS regarde son prototype
- Sinon, il vérifie le prototype suivant
- Au sommet se trouve
Object.prototype→ si toujours pas trouvé →null
const animal = { eats: true };
const rabbit = { jumps: true };
Object.setPrototypeOf(rabbit, animal);
console.log(rabbit.jumps); // true (propriété propre)
console.log(rabbit.eats); // true (héritée du prototype)
Explication amusante :
rabbitajumpsdans son “ADN” → l’utilise immédiatementeatsmanque → consulteanimal- Si toujours absent → JS : “D’accord, voilà une valeur par défaut pour toi.” 😆
💡 Pro Astuce : Utilisez Object.getPrototypeOf(rabbit) pour inspecter son prototype.
3️⃣ Fonctions Constructrices : Ancien mais efficace ✨
Avant les classes, il y avait les fonctions constructrices.
function Person(name, age) {
this.name = name;
this.age = age;
}
// Tous les objets partagent la méthode greet
Person.prototype.greet = function() {
console.log(`Hi, I'm ${this.name}`);
};
const alice = new Person("Alice", 25);
const bob = new Person("Bob", 30);
alice.greet(); // Hi, I'm Alice
bob.greet(); // Hi, I'm Bob
Explication amusante :
this.name→ propre à chaque instancePerson.prototype.greet→ méthode partagée, économise de la mémoire 💾- JS partage les méthodes pour optimiser la mémoire
💡 Astuce : Utilisez les méthodes prototype dans de gros projets pour améliorer les performances.
4️⃣ Syntaxe Class : Le Wrapper Moderne de JS 🍬
Les classes ES6 rendent les constructeurs et prototypes plus lisibles et propres.
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hi, I'm ${this.name}`);
}
celebrateBirthday() {
this.age++;
console.log(`${this.name} is now ${this.age} years old! 🎉`);
}
}
const carol = new Person("Carol", 28);
carol.greet(); // Hi, I'm Carol
carol.celebrateBirthday(); // Carol est maintenant âgée de 29 ans ! 🎉
Explication amusante :
- La class est un joli emballage autour des prototypes 😎
- Les méthodes sont partagées entre toutes les instances
- Ajouter un comportement dynamiquement est très simple
💡 Pro Astuce : Object.getPrototypeOf(carol) → voir le prototype de la classe
5️⃣ Prototype Dynamique : Pouvoirs Ajoutés Plus Tard ⚡
Le prototype est comme un ADN vivant : même les instances existantes prennent les nouvelles méthodes automatiquement !
Person.prototype.sayAge = function() {
console.log(`I am ${this.age} years old`);
};
alice.sayAge(); // I am 25 years old
bob.sayAge(); // I am 30 years old
carol.sayAge(); // I am 29 years old
- Méthodes dynamiques et partagées → le super-pouvoir de JS 😎
💡 Astuce : Pour plus de clarté, ajoutez les méthodes au prototype dès le départ plutôt qu’après dans de gros projets.
6️⃣ Chaîne de Prototypes : Étape par Étape 🕵️♂️
console.log(carol.toString()); // [object Object]
toString→ pas sur Carol- Pas sur le prototype de la classe
- JS vérifie
Object.prototype→ trouvé
Chaîne :
carol → Person.prototype → Object.prototype → null
💡 Pro Astuce : Brisez la chaîne avec :
const obj = Object.create(null);
console.log(obj.toString); // undefined
7️⃣ Prototype et Code Mémoire-Friendly 💾
Mettre les fonctions sur le prototype → elles ne sont pas recréées pour chaque objet
function Car(model) {
this.model = model;
}
Car.prototype.drive = function() {
console.log(`${this.model} is driving 🚗`);
};
const tesla = new Car("Tesla");
const bmw = new Car("BMW");
tesla.drive(); // Tesla is driving 🚗
bmw.drive(); // BMW is driving 🚗
- La fonction
driveexiste une seule fois en mémoire → mémoire optimisée
💡 Astuce : Dans de grosses applications, les méthodes prototype économisent de la mémoire pour des milliers d’objets
8️⃣ Mini Astuces : Découvrez les Secrets 🗝️
hasOwnProperty→ est-ce une propriété propre ou héritée ?Object.keys(obj)→ uniquement les propriétés propresfor...in→ itère aussi sur les propriétés héritées
console.log(alice.hasOwnProperty('name')); // true
console.log(alice.hasOwnProperty('greet')); // false (prototype)
💡 Pro Astuce : Inspectez les propriétés du prototype avec :
console.log(Object.getPrototypeOf(alice));
9️⃣ Usage Avancé : Partager des Fonctions via le Prototype 🦸♂️
Le prototype peut partager des fonctions, pas seulement des méthodes :
function Calculator() {}
Calculator.prototype.add = function(a, b) {
return a + b;
};
Calculator.prototype.subtract = function(a, b) {
return a - b;
};
const calc1 = new Calculator();
console.log(calc1.add(5, 3)); // 8
console.log(calc1.subtract(10, 4)); // 6
- Même avec 1000 instances → les fonctions existent une seule fois en mémoire 😎
💡 Astuce : Dans les grandes applications, placez les fonctions utilitaires sur le prototype pour économiser de la mémoire.
🎯 Résumé : Maîtriser le Prototypage
- ADN caché des objets → prototype
- Propriété manquante → regarder la chaîne
- Constructor / Class → sucre syntaxique
- Mettre les méthodes sur le prototype → mémoire optimisée
- Ajout dynamique → toutes les instances en bénéficient
- Briser la chaîne →
Object.create(null) - Code performant et économe en mémoire → bénéfique pour gros projets
Dernier mot : “Les objets JavaScript peuvent te surprendre, mais une fois que tu comprends leur ADN prototype, tu peux contrôler chaque objet comme un pro !” 😄

