Leçon 2/6 10 min

Objet et classe : le moule et les gâteaux

La distinction qui bloque tout le monde au début : la classe est le moule, l'objet est le gâteau qu'on en sort. Avec une fabrique d'objets interactive.

FR EN

Un objet, d'accord. Mais comment en faire mille ?

À la leçon précédente, on a vu qu'un objet regroupe des propriétés (ses données) et des méthodes (ce qu'il sait faire). Très bien pour un compte. Mais un vrai site en a des milliers, tous bâtis sur le même modèle. On ne va pas réécrire le code de zéro pour chaque client. Il nous faut un plan, un moule, qu'on réutilise autant de fois qu'on veut.

Ce moule, c'est la classe. Et chaque objet fabriqué à partir d'elle, c'est une instance.

La classe est le moule, l'objet est le gâteau

C'est la distinction qui bloque tout le monde au début, alors prenons une image qui ne te lâchera plus. Un moule à gâteau, ce n'est pas un gâteau : on ne peut pas le manger. C'est une forme, une description de ce que seront les gâteaux. Avec un seul moule, tu fais autant de gâteaux que tu veux, et chacun est distinct : celui-ci au chocolat, celui-là à la vanille, mais tous ont la même forme.

  • La classe = le moule. Elle décrit les propriétés (quelles données) et les méthodes (quelles actions), une bonne fois. On l'écrit une seule fois.
  • L'objet (ou instance) = le gâteau. C'est une chose concrète, fabriquée à partir de la classe, avec ses propres valeurs.
Une classe Compte (le moule, à gauche) sert à fabriquer plusieurs objets Compte (les instances, à droite), chacun avec ses propres valeurs de solde et de titulaire. La classe (le moule) Les objets (les gâteaux) classe Compte propriétés titulaire solde méthodes deposer() new Compte #1 Alice · solde 120 € Compte #2 Bob · solde 0 € Compte #3 Charlie · solde 50 € Même moule, mais chaque objet a ses propres valeurs (son propre état).
On écrit la classe une fois ; on en instancie autant d'objets qu'on veut, chacun avec son propre état.

En code : définir la classe, créer les objets

En pseudo-code (valable presque partout) : on décrit la classe, puis le mot-clé new fabrique une instance. Le constructeur est la recette qui « remplit le moule » au moment de la création.

classe Compte:
    propriété titulaire
    propriété solde

    constructeur(titulaire):       // appelé par "new", remplit l'objet
        this.titulaire = titulaire
        this.solde = 0

    méthode deposer(montant):
        this.solde = this.solde + montant

// On fabrique des objets DISTINCTS à partir de la même classe :
compteAlice = new Compte("Alice")
compteBob   = new Compte("Bob")

compteAlice.deposer(120)
// compteAlice.solde vaut 120 ; compteBob.solde vaut toujours 0

Le mot this (ou self selon les langages) désigne l'objet en train d'être manipulé : « mon propre solde », pas celui du voisin. C'est ce qui fait que chaque compte est indépendant.

La fabrique d'objets (essaie !)

Voici une vraie classe qui tourne dans ton navigateur. Donne un nom, clique sur new Compte(...), et regarde : chaque objet créé est autonome, avec son propre solde. Une seule classe, autant d'objets que tu veux.

La classe (le moule)
class Compte {
  constructor(titulaire) {
    this.titulaire = titulaire;
    this.solde = 0;
  }
  deposer(m) { this.solde += m; }
  retirer(m) { if (m <= this.solde) this.solde -= m; }
}

0 objet(s) créé(s) depuis la même classe

Une classe, mille objets indépendants

C'est tout l'intérêt : tu écris la logique une fois (dans la classe), et tu la réutilises pour des milliers d'objets, chacun avec son état. Déposer sur le compte d'Alice ne touche pas celui de Bob, parce que this.solde pointe vers cet objet-là. C'est aussi ce qui rend le code testable : on peut créer un objet isolé et vérifier qu'il se comporte bien.

Vocabulaire : « créer un objet à partir d'une classe » se dit instancier. Un objet est donc une instance de sa classe. Tu entendras les deux mots tout le temps — maintenant tu sais que ça veut juste dire « un gâteau sorti du moule ».

Rappel libre

Sans remonter dans la leçon : avec tes mots, quelle est la différence entre une classe et un objet (une instance) ? Et après new Compte("Alice"), à quoi sert this dans la méthode deposer() ?

La classe est le moule : une description écrite une seule fois (propriétés + méthodes). L'objet (ou instance) est une chose concrète fabriquée avec new, avec ses propres valeurs. À partir d'une classe on instancie autant d'objets qu'on veut. Dans deposer(), this désigne l'objet sur lequel on appelle la méthode : this.solde c'est « le solde de CET objet-là ». C'est pour ça que déposer sur Alice ne touche pas Bob.
Accepter ou rejeter le code de l'IA

Tu demandes à l'IA de gérer plusieurs clients. Elle te propose ce code. Ton rôle de relecteur : l'accepter tel quel ou le rejeter, et dire pourquoi.

// Un seul objet "compte" qu'on réutilise pour chaque client
const compte = { titulaire: "", solde: 0 };

function nouveauClient(nom, depot) {
  compte.titulaire = nom;     // on écrase l'ancien
  compte.solde = depot;
  return compte;
}

const alice = nouveauClient("Alice", 120);
const bob   = nouveauClient("Bob", 0);
// alice et bob pointent vers le MÊME objet…
Rejeter. C'est exactement le piège que la classe résout. Ici il n'y a qu'un seul objet réutilisé : nouveauClient("Bob"…) écrase les valeurs d'Alice, et alice comme bob pointent vers le même objet. Résultat : alice.solde vaut 0, le solde de Bob. Il manque la vraie instanciation. La bonne version : une class Compte et un new Compte(nom) par client, pour que chaque objet ait son propre état indépendant.
Dans l'analogie du moule, qu'est-ce que la classe ?
Après new Compte("Alice") et new Compte("Bob"), si on dépose sur le compte d'Alice…
Prochaine étape

Tu sais fabriquer des objets à partir d'une classe. Mais dans la fabrique ci-dessus, rien n'empêche d'écrire compte.solde = 999999 directement, sans passer par deposer(). C'est exactement le problème que règle le prochain pilier : l'encapsulation.

Leçon 3 : l'encapsulation →

An object, fine. But how do you make a thousand?

In the previous lesson, we saw that an object groups properties (its data) and methods (what it can do). Great for one account. But a real site has thousands, all built on the same model. We're not going to rewrite the code from scratch for each customer. We need a blueprint, a mold, that we reuse as many times as we want.

That mold is the class. And each object built from it is an instance.

The class is the mold, the object is the cake

This is the distinction that trips everyone up at first, so here's an image that will stick. A cake mold is not a cake: you can't eat it. It's a shape, a description of what the cakes will be. With a single mold, you bake as many cakes as you want, and each is distinct: this one chocolate, that one vanilla, but all share the same shape.

  • The class = the mold. It describes the properties (which data) and the methods (which actions), once. You write it a single time.
  • The object (or instance) = the cake. A concrete thing, built from the class, with its own values.
A Compte class (the mold, on the left) is used to build several Compte objects (the instances, on the right), each with its own balance and owner values. The class (the mold) The objects (the cakes) class Account properties owner balance methods deposit() new Account #1 Alice · balance 120 Account #2 Bob · balance 0 Account #3 Charlie · balance 50 Same mold, but each object has its own values (its own state).
You write the class once; you instantiate as many objects as you want, each with its own state.

In code: define the class, create the objects

In pseudo-code (valid almost everywhere): you describe the class, then the keyword new builds an instance. The constructor is the recipe that "fills the mold" at creation time.

class Account:
    property owner
    property balance

    constructor(owner):            // called by "new", fills the object
        this.owner = owner
        this.balance = 0

    method deposit(amount):
        this.balance = this.balance + amount

// We build DISTINCT objects from the same class:
aliceAccount = new Account("Alice")
bobAccount   = new Account("Bob")

aliceAccount.deposit(120)
// aliceAccount.balance is 120 ; bobAccount.balance is still 0

The word this (or self depending on the language) refers to the object currently being handled: "my own balance", not the neighbor's. That's what makes each account independent.

The object factory (try it!)

Here's a real class running in your browser. Enter a name, click new Compte(...), and watch: each created object is independent, with its own balance. One class, as many objects as you want.

The class (the mold)
class Compte {
  constructor(titulaire) {
    this.titulaire = titulaire;
    this.solde = 0;
  }
  deposer(m) { this.solde += m; }
  retirer(m) { if (m <= this.solde) this.solde -= m; }
}

0 objects created from the same class

One class, a thousand independent objects

That's the whole point: you write the logic once (in the class), and reuse it for thousands of objects, each with its own state. Depositing into Alice's account doesn't touch Bob's, because this.balance points to that object. It also makes code testable: you can create an isolated object and check it behaves.

Vocabulary: "creating an object from a class" is called instantiating. An object is therefore an instance of its class. You'll hear both words constantly — now you know it just means "a cake out of the mold".

Next step

You know how to build objects from a class. But in the factory above, nothing stops you from writing account.solde = 999999 directly, bypassing deposer(). That's exactly the problem the next pillar solves: encapsulation.

Lesson 3: encapsulation →
Besoin d'un développeur pour votre projet ?

Réponse sous 24h · Sans engagement