Essayer de coder ← Retour aux sujets

Objets littéraux

{ }

Un objet regroupe des propriétés (clé → valeur) : c'est l'équivalent du dictionnaire Python. Les valeurs peuvent être des nombres, des textes, des tableaux, d'autres objets, des fonctions (les méthodes).

const eleve = { nom: "Lina", age: 17 };
Création d'un objet
eleve.nom eleve["nom"]
Lire une propriété (crochets si la clé est dans une variable)
eleve.age = 18; eleve.classe = "1ere";
Modifier une propriété / en ajouter une
delete eleve.age
Supprimer une propriété
"nom" in eleve
Teste la présence d'une clé
Object.keys(o) Object.values(o) Object.entries(o)
Clés / valeurs / paires [clé, valeur]
eleve.js
const eleve = { nom: "Lina", age: 17, notes: [12, 15] };

eleve.age = 18;
eleve.classe = "1ere";
console.log(eleve.nom, eleve["age"], eleve.notes.length);
console.log(Object.keys(eleve).join(", "));
console.log("classe" in eleve, "email" in eleve);
Affichage
Lina 18 2
nom, age, notes, classe
true false

JSON et classes

JSON · class

JSON est un format texte pour échanger des données. Une classe décrit un modèle d'objets avec ses propriétés et ses méthodes.

JSON.stringify(objet)
Objet vers texte JSON
JSON.parse(texte)
Texte JSON vers objet
class Point { constructor(x, y) { … } }
Modèle d'objets
new Point(1, 2)
Crée un objet à partir du modèle
this
L'objet sur lequel la méthode est appelée
class Chien extends Animal { … }
Héritage : Chien reprend Animal
json.js
const eleve = { nom: "Lina", age: 17, notes: [12, 15] };

const texte = JSON.stringify(eleve);
console.log(texte);

const copie = JSON.parse(texte);
copie.age = 99;
console.log(eleve.age, copie.age);
Affichage
{"nom":"Lina","age":17,"notes":[12,15]}
17 99

🧱 Le cours : structurer des données

En JavaScript, presque tout est un objet. Un objet littéral est la façon la plus simple de regrouper des informations qui décrivent une même chose : un élève, un produit, un réglage. C'est aussi la forme des données que s'échangent les sites web (JSON).

Lire et écrire des propriétés

On accède à une propriété avec le point (eleve.nom) ou avec des crochets (eleve["nom"]). Les crochets servent quand le nom de la clé est dans une variable ou n'est pas un identifiant valide (objet["mon-champ"]). Lire une propriété qui n'existe pas donne undefined ; en revanche lire une propriété de undefined ou null lève une TypeError (d'où ?., voir Conditions). Quand la variable porte le même nom que la clé, on écrit { nom, age } au lieu de { nom: nom, age: age }.

Méthodes et this

Une propriété dont la valeur est une fonction est une méthode. À l'intérieur, this désigne l'objet sur lequel on l'appelle : compte.deposer(50) exécute deposer avec this égal à compte.

methodes.js
const compte = {
  titulaire: "Lina",
  solde: 100,
  deposer(montant) {
    this.solde += montant;
    return this.solde;
  },
  resume() {
    return `${this.titulaire} : ${this.solde} euros`;
  },
};

compte.deposer(50);
console.log(compte.resume());
Affichage
Lina : 150 euros

Décomposition et spread

La décomposition extrait des propriétés dans des variables (const { nom, age } = eleve;). Le spread ...objet copie toutes les propriétés d'un objet dans un nouveau, ce qui permet de « modifier sans modifier » : on copie puis on écrase ce qui change.

decomposition.js
const eleve = { nom: "Lina", age: 17 };
const { nom, age } = eleve;
const majeur = { ...eleve, age: 18, classe: "Tle" };

console.log(nom, age);
console.log(JSON.stringify(majeur));
Affichage
Lina 17
{"nom":"Lina","age":18,"classe":"Tle"}

Parcourir un objet

Object.keys(o), Object.values(o) et Object.entries(o) renvoient des tableaux (clés, valeurs, paires) que l'on parcourt avec for…of, map, etc. Un objet n'est pas itérable directement : for (const x of objet) lève une erreur.

parcours.js
const notes = { maths: 14, nsi: 17, anglais: 12 };
let somme = 0;

for (const [matiere, note] of Object.entries(notes)) {
  somme += note;
  console.log(`${matiere} : ${note}`);
}
console.log(`moyenne : ${(somme / 3).toFixed(1)}`);
Affichage
maths : 14
nsi : 17
anglais : 12
moyenne : 14.3

Un tableau d'objets : la forme des vraies données

Une liste d'élèves, de produits ou de messages est presque toujours un tableau d'objets. filter, map, reduce et sort (voir Tableaux) travaillent alors sur les propriétés.

liste.js
const eleves = [
  { nom: "Lina", note: 15 },
  { nom: "Sami", note: 9 },
  { nom: "Nova", note: 18 },
];

const admis = eleves.filter((e) => e.note >= 10).map((e) => e.nom);
const meilleur = eleves.reduce((m, e) => (e.note > m.note ? e : m));

console.log(admis.join(", "));
console.log(meilleur.nom);
Affichage
Lina, Nova
Nova

JSON : échanger des données

JSON (*JavaScript Object Notation*) est un format texte qui ressemble à un objet JavaScript, avec des règles plus strictes : clés entre guillemets doubles, pas de virgule finale, pas de fonctions ni de undefined. JSON.stringify(valeur) fabrique le texte (un troisième argument, 2, l'indente pour le rendre lisible) et JSON.parse(texte) reconstruit l'objet ; ce dernier lève une exception si le texte n'est pas du JSON valide. C'est le format des réponses des serveurs (voir Asynchrone).

json2.js
const texte = '{"nom":"Lina","notes":[12,15]}';
const donnees = JSON.parse(texte);

console.log(donnees.notes[1]);
console.log(JSON.stringify(donnees, null, 2));
try {
  JSON.parse("{nom: 'Lina'}");
} catch (erreur) {
  console.log("JSON invalide");
}
Affichage
15
{
  "nom": "Lina",
  "notes": [
    12,
    15
  ]
}
JSON invalide

Les classes

Quand on crée beaucoup d'objets de même forme, une classe évite de recopier les mêmes propriétés et méthodes. Le constructor initialise l'objet créé avec new ; extends crée une classe qui hérite d'une autre, et une méthode redéfinie dans la classe fille remplace celle de la mère (polymorphisme, comme en POO Java).

classes.js
class Animal {
  constructor(nom) {
    this.nom = nom;
  }

  crier() {
    return "...";
  }

  presenter() {
    return `${this.nom} dit ${this.crier()}`;
  }
}

class Chien extends Animal {
  crier() {
    return "Ouaf !";
  }
}

console.log(new Animal("Inconnu").presenter());
console.log(new Chien("Rex").presenter());
Affichage
Inconnu dit ...
Rex dit Ouaf !

Sous le capot, les classes JavaScript sont du sucre syntaxique sur les prototypes. Tu peux aussi déclarer des propriétés privées avec # (#solde), des méthodes static et des accesseurs get / set.

Copier un objet

Comme pour les tableaux, const b = a; ne copie pas : les deux noms désignent le même objet. { ...a } fait une copie superficielle (les objets imbriqués restent partagés) ; structuredClone(a) fait une copie complète. Object.freeze(a) empêche toute modification (superficielle aussi).

⚠️ Erreurs fréquentes

Perdre this

À éviter
faux.js
const compte = { solde: 100, voir() { return this.solde; } };
const f = compte.voir;
f();                      // this n'est plus compte : undefined ou erreur
Correct
correct.js
const f = compte.voir.bind(compte);   // fixe this
f();                                   // 100

Une méthode séparée de son objet (passée en callback, stockée dans une variable) perd son this. Solutions : bind, une fonction fléchée (() => compte.voir()), ou appeler la méthode directement sur l'objet.

Une fonction fléchée comme méthode

Une fonction fléchée n'a pas de this propre : elle reprend celui du code qui l'entoure. Dans { solde: 1, voir: () => this.solde }, this n'est pas l'objet. Écris la méthode avec la syntaxe courte voir() { … }.

Comparer deux objets avec ===

{ a: 1 } === { a: 1 } est false : deux objets distincts, même avec le même contenu. Compare les propriétés, ou JSON.stringify pour de petites structures.

Du JSON qui n'en est pas

À éviter
faux.json
{ nom: 'Lina', 'age': 17, }       // clés sans guillemets, apostrophes, virgule finale
Correct
correct.json
{ "nom": "Lina", "age": 17 }        // guillemets doubles, pas de virgule finale

JSON.stringify ignore aussi silencieusement les fonctions et les valeurs undefined, convertit les dates en texte, et plante sur les références circulaires.

Lire une propriété d'une valeur absente

eleve.adresse.ville lève « Cannot read properties of undefined » si adresse n'existe pas. Protège avec eleve.adresse?.ville ou vérifie l'existence.

Croire que const empêche de modifier un objet

const o = { a: 1 }; o.a = 2; est autorisé. Seule la réaffectation o = {} est interdite.

📋 Aide-mémoire

  • { cle: valeur } ; lecture o.cle ou o["cle"] ; absent : undefined ; "cle" in o, delete o.cle.
  • Object.keys / values / entries(o) donnent des tableaux ; for (const [k, v] of Object.entries(o)).
  • Méthode : { voir() { return this.x; } } ; this = l'objet appelant ; fléchée = pas de this propre.
  • Décomposition const { a, b } = o ; copie superficielle { ...o } ; copie complète structuredClone(o).
  • JSON : clés et textes entre guillemets doubles ; JSON.stringify(o, null, 2) / JSON.parse(texte) (avec try / catch).
  • class A { constructor() {} méthode() {} }, new A(), class B extends A, super(…).