Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🟨
Avance 25 min JavaScript

Le prototypage en JavaScript

Pourquoi prototypage en JavaScript ?

Le prototypage est un concept fondamental de JavaScript et un élément clé dans sa façon de fonctionner. En tant que développeur, vous devrez souvent avoir recours à ce mécanisme pour créer des objets et des classes. Voici pourquoi le prototypage est si important :

  • Flexibilité et réutilisabilité : Avec le prototypage, vous pouvez ajouter des propriétés et des méthodes aux objets existants, même ceux qui sont définis par d'autres bibliothèques ou frameworks.
  • Efficacité de la mémoire : En JavaScript, chaque objet crée a un lien vers son prototype. Cela permet de partager les méthodes entre plusieurs objets sans répéter le code.

Un cas concret de l'utilisation du prototypage est lorsqu'on développe une application web interactive où des objets représentant des entités comme des utilisateurs ou des produits sont fréquemment manipulés. En ajoutant des méthodes au prototype des objets, on peut simplifier le code et améliorer sa lisibilité.

Prerequis

Avant de commencer ce tutoriel, vous devrez avoir les connaissances suivantes :

  • JavaScript avancé : Comprendre les concepts de fonctions, d'objets, et de closure.
  • ES6+ syntaxe : Familiarité avec les nouvelles fonctionnalités introduites par ECMAScript 2015 et ses versions ultérieures.

Vous n'avez pas besoin d'installer quoi que ce soit car le prototypage est une fonctionnalité native du langage JavaScript.

Concepts fondamentaux

1. Prototypes et chaîne de prototypes

Chaque objet en JavaScript a un lien vers un autre objet, appelé son prototype. Lorsqu'un accès à une propriété ou à une méthode est effectué sur un objet, JavaScript cherche d'abord dans cet objet. Si la propriété ou la méthode n'est pas trouvée, il remonte à l'objet du prototype et continue cette recherche jusqu'à ce que le chemin de la chaîne de prototypes soit terminé (lorsqu'il atteint Object.prototype).

// Création d'un objet avec un prototype
function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const john = new Person('John');
john.sayHello(); // "Hello, my name is John"

2. Création d'objets avec Object.create

La méthode Object.create() peut être utilisée pour créer un nouvel objet en spécifiant son prototype.

// Création d'un objet avec un prototype personnalisé
const animalPrototype = {
  makeSound: function() {
    console.log('Some generic sound');
  }
};

const dog = Object.create(animalPrototype);
dog.name = 'Buddy';

dog.makeSound(); // "Some generic sound"

3. Utilisation de this et des méthodes

Dans les méthodes d'un objet, this fait référence à l'objet qui est utilisé pour appeler la méthode.

// Utilisation de this dans une méthode
const calculator = {
  value: 0,
  add: function(num) {
    this.value += num;
  },
  subtract: function(num) {
    this.value -= num;
  }
};

calculator.add(5);
console.log(calculator.value); // 5
calculator.subtract(2);
console.log(calculator.value); // 3

4. Surcharge des méthodes

Vous pouvez surcharger les méthodes d'un objet en redéfinissant ces méthodes dans le prototype.

// Surcharge de la méthode makeSound
dog.makeSound = function() {
  console.log('Woof!');
};

dog.makeSound(); // "Woof!"

Mise en pratique : projet fil rouge

Nous allons créer un simple gestionnaire de tâches en utilisant le prototypage. Le gestionnaire devra permettre d'ajouter, de supprimer et de lister les tâches.

// Structure des fichiers :
// - taskManager.js (contient la classe TaskManager)
// - index.js (utilise la classe TaskManager)

// taskManager.js
function Task(title, description) {
  this.title = title;
  this.description = description;
}

Task.prototype.toString = function() {
  return `${this.title}: ${this.description}`;
};

function TaskManager() {
  this.tasks = [];
}

TaskManager.prototype.addTask = function(task) {
  this.tasks.push(task);
};

TaskManager.prototype.removeTask = function(index) {
  if (index >= 0 && index < this.tasks.length) {
    this.tasks.splice(index, 1);
  }
};

TaskManager.prototype.listTasks = function() {
  return this.tasks.map((task, index) => `${index}: ${task.toString()}`);
};

// index.js
const taskManager = new TaskManager();
taskManager.addTask(new Task('Buy groceries', 'Milk, bread, and eggs'));
taskManager.addTask(new Task('Finish project', 'Code, test, deploy'));

console.log(taskManager.listTasks());
// Output:
// 0: Buy groceries: Milk, bread, and eggs
// 1: Finish project: Code, test, deploy

taskManager.removeTask(0);
console.log(taskManager.listTasks());
// Output:
// 0: Finish project: Code, test, deploy

Étapes détaillées :

  1. Création de la classe Task :

    • La fonction Task prend deux paramètres : title et description.
    • L'objet créé contient ces deux propriétés.
  2. Ajout d'une méthode toString au prototype de Task :

    • Cette méthode renvoie une chaîne représentant la tâche.
  3. Création de la classe TaskManager :

    • La fonction TaskManager initialise un tableau vide pour stocker les tâches.
  4. Ajout des méthodes addTask, removeTask, et listTasks au prototype de TaskManager :

    • addTask ajoute une tâche à la liste.
    • removeTask supprime une tâche en fonction de son index.
    • listTasks retourne une chaîne représentant toutes les tâches.
  5. Utilisation du gestionnaire de tâches :

    • Nous créons une instance de TaskManager.
    • Nous ajoutons quelques tâches et affichons la liste des tâches.
    • Nous supprimons une tâche et réaffichons la liste mise à jour.

Erreurs frequentes et debugging

1. Accès à une propriété non définie

const user = { name: 'Alice' };
console.log(user.age); // undefined
## 
if (user.age !== undefined) {
  console.log(user.age);
} else {
  console.log('Age is not defined');
}

2. Méthode non trouvée sur un objet

const person = { name: 'Bob' };
person.sayHello(); // Erreur : person.sayHello is not a function
## 
if (typeof person.sayHello === 'function') {
  person.sayHello();
} else {
  console.log('sayHello method is not defined');
}

3. Utilisation incorrecte de this dans une méthode

const button = document.querySelector('button');
button.addEventListener('click', function() {
  this.style.backgroundColor = 'red'; // this n'est pas le bouton
});
## 
const button = document.querySelector('button');
button.addEventListener('click', () => {
  this.style.backgroundColor = 'red'; // this est le bouton
});

Pour aller plus loin

  1. Classes ES6 : Apprenez à utiliser les classes ES6, qui sont une syntaxe simplifiée pour définir des objets et leurs méthodes.

  2. Prototypage avancé : Explorez comment utiliser le prototypage pour créer des interfaces de programmation (API) plus complexes.

  3. Object.defineProperty : Apprenez à ajouter des propriétés avec des caractéristiques spécifiques en utilisant Object.defineProperty.

Un défi pratique à réaliser seul est d'implémenter une API simple pour gérer un blog, permettant d'ajouter des articles, de les supprimer et de les lister.

En suivant ce tutoriel, vous devriez être capable de comprendre et d'utiliser le prototypage en JavaScript avec confiance.

Besoin d'aide sur JavaScript ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Quelle est la différence entre 'console.log' et 'alert' en JavaScript ?
'console.log' est utilisé pour afficher des messages dans la console du navigateur, tandis que 'alert' affiche une boîte de dialogue avec le message spécifié.
Comment puis-je déboguer mon code JavaScript ?
Vous pouvez utiliser les outils de développement intégrés dans votre navigateur (comme Chrome DevTools), qui offrent des fonctionnalités telles que l'inspecteur d'éléments, la console et le débogueur.
Qu'est-ce qu'une fonction anonyme en JavaScript et comment l'utilise-t-on ?
Une fonction anonyme est une fonction sans nom qui peut être définie directement dans un autre contexte. Elle est souvent utilisée pour passer des fonctions comme arguments à d'autres fonctions.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.