Introduction aux objets
en JavaScript
Amadou Lamine NDIAYE
dernière modification 15/11/2023 © ISEP-2024 alndiaye 1
Types primitif / type objet
• Type primitif
• Une variable de type primitif ne stocke qu’une simple valeur (chaîne de caractères,
nombre, booléen…)
• Type objet
• Un objet permet de définir des entités plus complexes en regroupant un ensemble de
valeurs pouvant être soit des valeurs primitives soit d’autres objets.
let jedi = {
nom : 'Skywalker',
let nom = 'Skywalker'; prenom: 'Luke';
}
nom 'Skywalker'
nom 'Skywalker' jedi
prénom 'Luke'
variable de type primitif variable de type objet
la variable stocke la valeur la variable stocke la référence (adresse) de l'objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 2
JavaScript et programmation orientée objet
• JavaScript permet l'utilisation d'objets et dispose d'objets natifs mais n'est pas
à proprement parler un langage orienté objet au sens classique du terme
• ne fournit pas d'éléments de langage pour supporter ce paradigme (par exemple pas de
notion explicite de classe comme en Java, C++) mais émule certains de ses principes
• Deux types d’objets
• Objets natifs
• types prédéfinis : Array, String, Date …
• objets liés à l'environnement d'exécution
• window , document … dans le navigateur
• process … dans NodeJs
• Objets personnalisés
• types définis par l'application
dernière modification 15/11/2023 © ISEP-2024 alndiaye 3
Syntaxe littérale
• objet JavaScript = une collection de valeurs nommées (propriétés ou attributs).
• sous sa forme littérale un objet est défini par :
• un ensemble de couples nom : valeur, séparés par des , et délimité par { }
un nom : Félicité
des activités préférées:
code JavaScript : Littéral Objet
dormir,
un âge : 10 ans manger du thon, une variable référence
grimper aux arbres
une race :
chat de gouttière let felicite = {
le nom d'une propriété "nom": "Félicité",
peut être n'importe quelle age: 10,
objet représentant ce chat chaîne de caractères (les race: "chat de gouttière",
guillemets sont facultatifs
sauf si le nom est une aime: ["manger du thon",
nom : "Félicité"
chaîne qui ne correspond "grimper aux arbres",
age : 10 pas à un identificateur "dormir"],
race : "chat de goutière" valide *)
aime : [
};
"manger du thon",
"grimper aux arbres"
trailing comma facultative
"dormir"] facilite ajout, suppression, déplacement de propriétés
*chaîne sans espaces ni caractères spéciaux (hormis $ et _ ) et ne commençant pas par un chiffre
dernière modification 15/11/2023 © ISEP-2024 alndiaye 4
Syntaxe littérale
• Objet javascript = un ensemble de propriétés (couples nom : valeur)
• Valeur d'une propriété peut être définie par n'importe quelle expression, et même depuis un autre objet littéral
objet représentant let elodie = {
le chat Félicité nom: "DUPONT",
prenom: "Elodie",
nom : "Félicité" age : 19,
nom : "Félix"
age : 10 age : 10 adresse: {
race : "chat de goutière" race : "siamois" no: 135,
aime : [ aime : [ objet littéral
"manger du thon", rue: "Rue de la Gare",
"grimper aux arbres"
… imbriqué
] codePostal: 38000,
"dormir"] , ,
maitre:
ville: "GRENOBLE"
maitre:
} ,
};
références
d'objets let felicite = {
nom: "Félicité",
nom: "DUPONT" age : 10, let felix = {
prenom : "Elodie"
age : 19 race : "chat de gouttière", nom: "Félix",
adresse: aime : [ age : 10,
"manger du thon", race : "Siamois",
no: 135
objet représentant rue : "Rue de la Gare" "grimper aux arbres", aime : [
Elodie DUPONT codePostal: 38000 "dormir" ...
ville: GRENOBLE ],
],
référence
une adresse maitre: elodie , maitre: elodie ,
}; };
dernière modification 15/11/2023 © ISEP-2024 alndiaye 5
Références
• Pour désigner des objets on utilise des variables d’un type particulier : les références
• Une référence contient l’adresse d’un objet (elle pointe vers la structure de données correspondant aux
propriétés (attributs) de l'objet)
• Affecter une référence à une autre référence consiste à recopier les pointeurs
• Une référence peut posséder la valeur null (aucun objet n’est accessible par cette référence)
point1 x : 10 let point1 = {
y: 10
x : 10,
y : 10
};
point2 x : 10 let point2 = {
y: 10
x : 10,
y : 10
point3 };
let point3 = point2;
une référence n’est pas un objet, c’est un nom pour
point4 accéder à un objet
référence null let point3 = null;
dernière modification 15/11/2023 © ISEP-2024 alndiaye 6
Accès à la valeur d'une propriété d’un objet
• notation pointée [Link]été
if ([Link] > 2) { ne peut être utilisée que si le nom de la propriété est un
[Link]("MAAOUU"); identificateur valide (chaîne sans espaces ni caractères
} else { spéciaux (hormis $ et _ ) et ne correspondant pas à un
[Link]("miaou"); mot réservé du langage)
}
• notation crochets (brackets) ref[expressionDeTypeString]
if (felicite["age"] > 2) { une alternative à la notation pointée, indispensable
... si le nom de la propriété ne correspond pas à un
identificateur valide
dernière modification 15/11/2023 © ISEP-2024 alndiaye 7
Accès à la valeur d'une propriété d’un objet
let myObject = {
nom : "attribut dont le nom est un identificateur",
$nom : "autre attribut 'normal'",
let : 'attribut dont le nom est un mot réservé',
15 : 'attribut dont le nom est un entier',
14 : 'attribut dont le nom est un entier',
1.5 : "attribut dont le nom est un nombre flottant",
"le prenom" : 'attribut dont le nom est un chaîne avec espaces',
"5aaaaa" : "un attribut dont le nom n'est pas un identificateur valide"
};
nom de la propriété notation pointée notation crochets
nom [Link] myObject["nom"]
$nom myObject.$nom myObject["$nom"]
let [Link] myObject["let"]
15 - myObject["15"] mais aussi myObject[15]
Obligatoire si le
14 - myObject["14"] mais aussi myObject[14] nom de la propriété
1.5 - myObject["1.5"] n'est pas un
identificateur
le prenom - myObject["le prenom"] valide
5aaaaa - myObject["5aaaaa"]
dernière modification 15/11/2023 © ISEP-2024 alndiaye 8
Accès à la valeur d'une propriété d’un objet
let elodie = { • accès à la valeur d'attributs d'objets imbriqués
nom: "DUPONT",
prenom: "Elodie", age :
19, adresse: { ex : accès au nom du maître de Félicité
no: 135,
rue: "Rue de la Gare",
• notation pointée
codePostal: 38000, ville:
"Grenoble"
} ,
presenteToi: function() {
return "Bonjour, mon nom est " + [Link];
[Link] + " " +
[Link];
}
}; • notation crochets (brackets)
let felicite = { felicite["maitre"]["nom"]
nom: "Félicité",
age : 10,
race : "chat de gouttière",
• possibilité de mélanger les différentes
aime : [ notations
"manger du thon", felicite["maitre"].nom
"grimper aux arbres" ,
"dormir"
], [Link]["nom"]
maitre: elodie
};
dernière modification 15/11/2023 © ISEP-2024 alndiaye 9
Accès à la valeur d'une propriété d’un objet
• Si on accède à un propriété qui n'existe pas la valeur retournée est undefined
let felicite = {
"nom": "Félicité",
age : 10, [Link] → undefined
race : "chat de gouttière",
aime : [
"manger du thon",
"grimper aux arbres",
"dormir"
]
};
• L'opérateur in permet de tester l'existence d'une propriété
"age" in felicite → true
"poids" in felicite → false
l'opérande gauche de in est une chaîne de caractères ou si c'est une expression d'un autre type elle sera
convertie en chaîne de caractères
dernière modification 15/11/2023 © ISEP-2024 alndiaye 10
Accès à la valeur d'une propriété d’un objet
• chaîne de propriétés
erreur pour
le 2ème chat
(Félix n'a pas
de maître)
P:\M2CCI> node
.\[Link] Félicité
a pour maitre Elodie
habitant à Grenoble
[Link]
a pour maitre ${chats[i].[Link]}
^
TypeError: Cannot read properties of undefined (reading
'prenom') at Object.<anonymous>
(P:\M2CCI\[Link]:39)
...
[Link] v17.7.2
P:\M2CCI>
dernière modification 15/11/2023 © ISEP-2024 alndiaye 11
Accès à la valeur d'une propriété d’un objet
• chaîne de propriétés
• opérateur .? + détails sur MDN
• fonctionne de manière similaire à opérateur . mais si sur le
chemin une référence est undefined ou null l'expression
se court-circuite et renvoie la valeur undefined
P:\M2CCI> node .\[Link]
Félicité
a pour maitre Elodie
habitant à Grenoble
Felix
a pour maitre undefined
habitant à undefined
Eustache
a pour maitre Mathieu
habitant à undefined
P:\M2CCI>
dernière modification 15/11/2023 © ISEP-2024 alndiaye 12
Accès à la valeur d'une propriété d’un objet
• la boucle for … in permet d'énumérer toutes les propriétés d'un objet
for (let nomProp in unObjet) {
// exécute le corps de la boucle pour chacun
// des noms de propriété de l'objet unObjet
}
boucle for-in la variable prop contient le
nom de la propriété
for (let prop in felicite) {
[Link]("ce chat a une propriété : " + prop);
c'est une chaîne de caractères
if (prop === "maitre") {
[Link]("Ce chat a pour maitre :");
[Link](felicite[prop]);
}
utilisation de la notation
tableau pour accéder à la
} valeur de la propriété
dernière modification 15/11/2023 © ISEP-2024 alndiaye 13
Accès à la valeur d'une propriété d’un objet
• dans quel ordre les propriétés de l'objet sont-elles accédées avec une boucle for … in ?
Les propriétés "entières" sont triées par
ordre croissant et affichées en premier
Les autres propriétés apparaissent dans
leur ordre de création
dernière modification 15/11/2023 © ISEP-2024 alndiaye 14
Modification des propriétés d’un objet
• changer la valeur d'une propriété
• Par affectation directe
[Link] = "mélange Chartreux et " + [Link];
• Par opérateur
[Link]++;
• Par appel d'une méthode (si la propriété est un objet ou un pseudo objet)
[Link]("faire ses griffes sur le canapé");
• ajouter une propriété
• si une affectation concerne une propriété non définie, une nouvelle propriété est crée
[Link] = 3.5; // à partir de ce point l'objet félicité a une propriété poids
• supprimer une propriété
• opérateur delete permet de supprimer un propriété d'un objet
delete [Link]; // à partir de ce point félicité.poids est undefined
dernière modification 15/11/2023 © ISEP-2024 alndiaye 15
Modification des propriétés d’un objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 16
Modification des propriétés d’un objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 17
Modification des propriétés d’un objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 18
Modification des propriétés d’un objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 19
Modification des propriétés d’un objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 20
Modification des propriétés d’un objet
à partir de ce point l'objet félicité a une propriété poids
dernière modification 15/11/2023 © ISEP-2024 alndiaye 21
Modification des propriétés d’un objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 22
Modification des propriétés d’un objet
à partir de ce point l'objet félicité a une propriété poids
à partir de ce point félicité.race
est undefined
dernière modification 15/11/2023 © ISEP-2024 alndiaye 23
Objets en paramètres de fonction
• Un paramètre de fonction peut être une référence d'objet
• déclaration Le paramètre objet est défini comme n'importe quelle
autre paramètre par un simple identifiant
function miauler(unChat) {
accès aux propriétés de l'objet
if ([Link] > 2) {
[Link]([Link] + " dit MAAOUU");
} else {
[Link]([Link]([Link] + " dit miaou");
}
}
appel de la fonction avec la référence de
• appel l'objet sur lequel l'appliquer.
miauler(felicite); Félicité dit MAAOUU
miauler( { nom: 'felix', age: 1.5} ); Félix dit miaou
appel de la fonction avec un littéral objet
dernière modification 15/11/2023 © ISEP-2024 alndiaye 24
Objets en paramètres de fonction
• comme en Java le passage de paramètres de fonctions est un passage par valeurs
• la fonction dispose d'une copie de la variable, toute modification de cette copie ne sera pas visible en dehors de la
fonction.
• si la variable est une référence, les propriétés de l'objet référencé peuvent elles être modifiées.
function maigrir(unChat, deltaPoids) {
nom : "Félicité"
[Link] = [Link] - deltaPoids; age : 10
race : "chat de goutière"
} aime : [
deltaPoids "manger du thon",
0. "grimper aux arbres"
2 "dormir"]
poids : 5.0
4.8
unChat
felicite
let felicite = { nom: "Félicité", age:10, poids: 5.0, …};
maigrir(felicite, 0.2);
[Link]("Félicité pèse " + [Link] + " kg");
Félicité pèse 4.8 kg
dernière modification 15/11/2023 © ISEP-2024 alndiaye 25
Modification des objets const
• un objet déclaré avec const peut être modifié
personne1 nom "Jean"
prénom "Dupont"
age 55
personne2 nom "Marcel"
prénom "Dupond"
age 57
dernière modification 15/11/2023 © ISEP-2024 alndiaye 26
Modification des objets const
• un objet déclaré avec const peut être modifié
personne1 nom "Jean"
prénom "Dupont"
c'est la propriété age qui est modifiée
la variable (référence) personne reste age 55
56
inchangée
personne2 nom "Marcel"
prénom "Dupond"
56
age 57
dernière modification 15/11/2023 © ISEP-2024 alndiaye 27
Modification des objets const
• un objet déclaré avec const peut être modifié
personne1 nom "Jean"
prénom "Dupont"
age 55
56
personne2 nom "Marcel"
prénom "Dupond"
56
tentative de modification age 57
de personne1 interdite
dernière modification 15/11/2023 © ISEP-2024 alndiaye 28
Modification des objets const
• un objet déclaré avec const peut être modifié
personne1 nom "Jean"
prénom "Dupont"
age 55
Si il n'y a pas d'autres
références sur l'objet
nom "Marcel" il ne pourra plus être
personne2 accédé. La mémoire
prénom "Dupond" allouée sera libérée
automatiquement
age 57 par l'interpréteur
JavaScript (garbage
recopie de la valeur de la variable personne1 collection)
dans la variable personne2 voir
dernière modification 15/11/2023 © ISEP-2024 alndiaye 29
Méthodes
• Les objets ne sont pas qu'un regroupement de valeurs, les propriétés peuvent être aussi
des fonctions (les objets peuvent aussi avoir un comportement).
let felicite = {
nom: "Félicité",
age : 10,
race : "chat de gouttière",
aime : [
"manger du thon",
"grimper aux arbres",
"dormir"
], une fonction anonyme est affectée à une
poids: 3.5 , propriété de l'objet
miauler: function () { ce type de fonction est généralement appelé
[Link]("Miaou ! Miaou !"); méthode de l'objet
}
};
• Invocation d'une méthode envoi du message miauler à l'objet
référencé par felicite
[Link]();
dernière modification 15/11/2023 © ISEP-2024 alndiaye 30
Le mot clé this
• comment accéder aux attributs d'un objet dans une méthode ?
let felicite = {
function maigrir(unChat, deltaPoids) {
nom: "Félicité",
age : 10, [Link] = [Link] – deltaPoids;
race : "chat de goutière",
aime : [ }
"manger du thon",
"grimper aux arbres", maigrir(felicite, 0.2);
"dormir"
], transformer cette fonction
poids: 3.5, en une méthode de l'objet.
miauler: function () {
[Link]("Miaou ! Miaou !");
},
maigrir: function (deltaPoids) {
pour désigner l'une des propriétés de
[Link] = [Link] – deltaPoids;
l'objet, le mot clé this doit être utilisé
}
};
appel de la méthode [Link](0.2);
Dans une méthode this désigne l'objet qui reçoit le message.
dernière modification 15/11/2023 © ISEP-2024 alndiaye 31
Créer plusieurs objets du même type ?
let felicite = { let felix = {
nom: "Félicité", nom: "Félix",
age : 10, age : 6,
race : "chat de gouttière" race : "siamois"
aime : [ aime : [
"manger du thon", "se lécher",
"grimper aux arbres" "manger des croquettes",
J'aimerais bien "dormir" "dormir"
avoir un deuxième ], ],
chat. Mais
comment faire ?
poids: 3.5, poids: 3.,
miauler: function () { miauler: function () {
[Link]("Miaou ! Miaou !"); [Link]("Miaou ! Miaou !");
}, },
maigrir : function(deltaPoids) { maigrir : function(deltaPoids) {
[Link] -= deltaPoids; [Link] -= deltaPoids;
} }
}; };
dernière modification 15/11/2023 © ISEP-2024 alndiaye 32
Créer plusieurs objets du même type ?
Dupliquer du code est souvent (toujours ?)
une mauvaise idée
• Source potentielle d'erreurs
• Difficulté de mises à jour
• Taille du code
• Lisibilité
dernière modification 15/11/2023 © ISEP-2024 alndiaye 34
Constructeur
Souvent les paramètres définissent
• Utiliser une fonction de création: constructeur les valeurs des propriétés que l'on
souhaite initialiser à la création de
une fonction comme une autre l’objet
par convention débute par Majuscule
var felicite = { function Chat(nom,age,race,poids) {
nom: "Félicité", [Link] = nom ;
age : 10, initialisation des
race : "chat de gouttière" [Link] = age ; propriétés de l'objet
aime : [
[Link] = race ; avec les valeurs des
"manger du thon",
"grimper aux arbres" paramètres
[Link] = poids ;
"dormir"
], [Link] = function () {
poids: 3.5,
miauler: function () { [Link]("Miaou ! Miaou !");
[Link]("Miaou ! Miaou !");
}, Définition };
maigrir : function(deltaPoids) { des
[Link] -= deltaPoids; méthodes
[Link] = function(deltaPoids)
} { [Link] -= deltaPoids;
};
};
}
un constructeur est invoqué par l'opérateur new
les objets référencés par
felicite et felix sont let felicite = new Chat("Félicité",10,"chat de gouttière",
des 'instances' de Chat. 3.5); let felix = new Chat("Felix",6,"siamois",3);
dernière modification 15/11/2023 © ISEP-2024 alndiaye 34
Constructeur et méthodes d’un objet En JavaScript les fonctions
sont des objets !
function Chat(nom,age,race,poids) {
[Link] = nom ;
fonction
[Link] = age ; felicite nom : "Félicité" miauler de
age : 10 felicite
[Link] = race ; race : "chat de goutière"
poids:3.5
[Link] = poids ;
miauler :
[Link] = function () { maigrir :
fonction
[Link]([Link] + "-> Miaou ! Miaou !"); maigrir de
felicite
};
[Link] = function(deltaPoids)
{ [Link] -= deltaPoids; felix fonction
nom : "Félix" miauler de
}; age :6 felix
race : "Siamois"
} poids:3
miauler :
let felicite = new Chat("Félicité",10,"chat de gouttière", 3.5); maigrir :
fonction
let felix = new Chat("Felix",6,"siamois",3); maigrir de
[Link](); Felicité -> Miaou ! Miaou ! felix
[Link](); Felix -> Miaou ! Miaou !
[Link]("[Link] === [Link] --> "
+ ([Link] === false
[Link]));
[Link] et [Link] référencent deux objets fonctions différents (même si ils font la même chose)
dernière modification 15/11/2023 © ISEP-2024 alndiaye 35
Prototype pour définir des propriétés
let objNew = new Object();
En JavaScript, tout objet possède une propriété privée "prototype" qui est
objNew.a = 1; un lien vers un autre objet (le prototype).
[Link](objNew); Le prototype, étant un objet, possède lui aussi un prototype... jusqu'au
let objBrut = {
prototype Object dont le prototype est null.
a: 1
}; Lors d'un appel à une propriété d'un objet, cette propriété est
[Link](objNew);
[Link](« Arrêtez ici !"); recherchée parmi les propriétés propres (non héritées d'un prototype)
puis de proche en proche parmi les propriétés des prototypes.
Chat {
a: 1,
Un objet hérite donc des propriétés de ses prototypes.
[[Prototype]]: Object Sauf spécifications d'héritage, la plupart des objets en JavaScript ont
}
uniquement comme prototype l'objet Object.
Chat {
a: 1,
[[Prototype]]: Object
}
dernière modification 15/11/2023 © ISEP-2024 alndiaye 36
Prototype pour définir des propriétés
• Un des intérêts majeurs des prototypes est l'héritage dynamique : tout
objet peut changer de parent à l'exécution, n'importe quand.
dernière modification 15/11/2023 © ISEP-2024 alndiaye 37
Prototype pour définir des propriétés
function Chat(nom,age,race,poids) {
[Link] = nom ;
[Link] = age ;
[Link] = race ; les propriétés rajoutées sur le prototype d'un
[Link] = poids ;
}
constructeur ne se limitent pas à des fonctions
méthodes elles peuvent être de n'importe quel
[Link] = function () {
[Link]([Link] + "-> Miaou ! Miaou !");
type.
};
[Link] = function(deltaPoids)
Une propriété définie sur le prototype d'un
{ [Link] -= deltaPoids; constructeur est accessible pour tous les objets
}; (instances) créés via ce constructeur
[Link] = "Felidés";
let felicite = new Chat("Félicité",10,"chat de gouttière", Chat {
nom: 'Félicité',
let felix = new 3.5); Chat("Felix",6,"siamois",3); age: 10,
race: 'chat de gouttière',
[Link](felicite), poids: 3.5
}
[Link](); Felicité -> Miaou ! Miaou !
[Link]([Link]);
Félidés
[Link]([Link]);
Félidés
dernière modification 15/11/2023 © ISEP-2024 alndiaye 38
Redéfinition d’une méthode
function Chat(nom,age,race,poids) {
[Link] = nom ;
[Link] = age ; Une propriété du prototype peut être redéfinie sur
[Link] = race ; une instance.
[Link] = poids ;
} Dans ce cas la redéfinition ne concerne que
[Link] = function () { l'instance
[Link]([Link] + "-> Miaou ! Miaou
!");
};
[Link] = function(deltaPoids)
{ [Link] -= deltaPoids;
};
let felicite = new Chat("Félicité",10,"chat de gouttière",
let felix = new 3.5); Chat("Felix",6,"siamois",3);
[Link](); Felicité -> Miaou ! Miaou !
[Link](); Felix -> Miaou ! Miaou !
[Link] = function () { redéfinition de la méthode
[Link]([Link] + "-> Meaow ! Meaow miauler pour felix
!");
};
[Link](); Felix -> Meaow ! Meaow !
[Link](); Felicité -> Miaou ! Miaou !
dernière modification 15/11/2023 © ISEP-2024 alndiaye 39
Modification du prototype du constructeur
function Chat(nom,age,race,poids) {
[Link] = nom ;
[Link] = age ; Une modification du prototype est immédiate pour
[Link] = race ; les instances déjà existantes. Le fallback se fait à
[Link] = poids ;
}
l'exécution (runtime) au moment de l'accès à la
propriété.
[Link] = function () {
[Link]([Link] + "-> Miaou ! Miaou
!");
};
[Link] = function(deltaPoids)
{ [Link] -= deltaPoids;
};
let felicite = new Chat("Félicité",10,"chat de gouttière", 3.5);
[Link](); Félicité -> Miaou ! Miaou !
[Link] = function () { modification de la méthode miauler du
[Link]([Link] + "-> Meaow ! Meaow prototype du constructeur
!");
};
[Link](); Félicité -> Miaou
Meaow ! Miaou
Meaow !
!
let felix = new
Chat("Felix",6,"siamois",3);
Felix -> Meaow
Miaou ! Meaow
Miaou !
!
[Link]();
dernière modification 15/11/2023 © ISEP-2024 alndiaye 40
Modification du prototype du constructeur
function Chat(nom,age,race,poids) {
[Link] = nom ; De la même manière qu'une modification, un
[Link] = age ; ajout au prototype est immédiatement actif et
[Link] = race ;
[Link] = poids ; s'applique à toutes les instances déjà créées
}
[Link] = function () {
[Link]([Link] + "-> Miaou ! Miaou
!");
};
[Link] = function(deltaPoids)
{ [Link] -= deltaPoids;
};
let felicite = new Chat("Félicité",10,"chat de gouttière",
3.5); [Link](); Félicité -> Miaou ! Miaou !
[Link](); Ce message provoquerait une erreur la méthode n'est pas
définie
[Link] = function () {
ajout de la méthode ronronner au
[Link]([Link] + "-> Rrr... prototype du constructeur
Rrr...");
};
[Link](); Félicité -> Rrr... Rrr...
dernière modification 15/11/2023 © ISEP-2024 alndiaye 41
Objets et ES5/ES6
• La création d'objets avec une fonction constructeur et l'opérateur new est
historique, elle masque le mécanisme de prototypage souvent mal compris
par les programmeurs.
• ES5 puis ES6 proposent de nouvelles manières de définir des objets (même si
en interne le principe du prototypage est inchangé) afin de rendre l'utilisation
des objets plus accessible aux développeurs:
• [Link]() (ES5)
• Classes (ES6)
dernière modification 15/11/2023 © ISEP-2024 alndiaye 42
Objets et ES5 : Object
• Depuis la version ES5 de JavaScript, l'objet prédéfini (built-in) Object propose
un certain nombre de méthodes pour créer et manipuler les prototypes :
• [Link](proto:Object) : Object
crée un nouvel objet ayant pour <prototype> l'objet proto passé en paramètre
• [Link](obj : Object) : Object
renvoie l'objet <prototype> de l'objet obj passé en paramètre
• [Link](obj: Object, proto: Object)
fixe le <prototype> de obj avec l'objet proto
dernière modification 15/11/2023 © ISEP-2024 alndiaye 43
Objets et ES6 : Classes
• Avec l'introduction de Class, ES6 offre une syntaxe compacte pour définir des chaînes de
prototypes et qui se rapproche de l'approche plus couramment utilisée dans les langages
orientés objets (langages de classes comme Java) ES6 + mot réservé pour identifier
class Chat { la fonction constructeur
avant ES6
constructor(nom,age,race,poids) {
function Chat(nom,age,race,poids) {
[Link] = nom ;
[Link] = nom ;
[Link] = age ; constructeur [Link] = age ;
Une classe ne peut avoi r
[Link] = race ; [Link] = race ;
qu'un seul constructeur
[Link] = poids;
⬄
[Link] = poids;
}
}
[Link] = function () { miauler() {
[Link]([Link] + "-> Miaou ! Miaou !"); [Link]([Link] + "-> Miaou ! Miaou !");
};
méthodes } pas de ; entre
[Link] = function(deltaPoids) {
[Link] -= deltaPoids;
maigrir(deltaPoids) { les déclaratio ns
}; [Link] -= deltaPoids; de méthodes
}
} Voir le code
dernière modification 15/11/2023 © ISEP-2024 alndiaye 44
allocation mémoire
Objets et ES6 : Classes
• Les objets créés par une déclaration de classe sont des objets fonction correspondant respectivement au
constructeur et aux méthodes de la classe ainsi que les prototypes associés
[Link]
class Chat {
constructor(nom,age,race,poids) {
[Link] = nom ;
[Link]
Chat
[Link] = age ;
[Link] = race ;
[Link] = poids;
[Link]
}
objets Function
miauler [Link] miauler() {
[Link]([Link] + "-> Miaou ! Miaou !");
}
maigrir(deltaPoids) {
maigrir [Link]
[Link] -= deltaPoids;
}
} Voir le code
dernière modification 15/11/2023 © ISEP-2024 alndiaye 45
allocation mémoire
Objets et ES6 : Classes
• La création des objets se fait comme précédemment avec l'opérateur new
let felix = new Chat("Felix",6,"siamois",3);
felix
[Link]
class Chat {
Chaîne de <prototypes> constructor(nom,age,race,poids) {
de l'objet felix
[Link] = nom ; appelée immédiatement après la
[Link]
Chat
[Link] = age ; création d'une nouvelle instance pour
l'initialiser. Cette fonction reçoit les
[Link] = race ; arguments passés après le nom de la
[Link] = poids; classe suivant l'opérateur new.
[Link]
}
objets Function
miauler [Link] miauler() {
[Link]([Link] + "-> Miaou ! Miaou !");
}
maigrir(deltaPoids) {
maigrir [Link]
[Link] -= deltaPoids;
}
} Voir le code
dernière modification 15/11/2023 © ISEP-2024 alndiaye 46
Objets et ES6 : Classes – attributs privés
Les attributs de la classe sont déclarés en dehors du constructeur. Un attribut peut être déclaré privé en
précédant son nom du caractère "#".
let felix = new Animal("chat", "Félix");
let medor = new Animal("chien", "Médor");
[Link]();
[Link]();
[Link]([Link]());
[Link](`Nombre d'animaux : ${[Link]}`);
[Link](42);
[Link](`Nombre d'animaux : ${[Link]}`);
dernière modification 15/11/2023 © ISEP-2024 alndiaye 47
Objets et ES6 : Classes – membres statiques
• Propriétés statiques
• Possibilité d'associer des propriétés à la classe directement
• déclaration de variable préfixée par le mot clé static
• Rattaché à la fonction Constructeur et non pas au class Chat {
prototype constructor(nom,age,race,poids) {
[Link] = nom ;
let felix = new Chat("Felix",6,"siamois",3); [Link] = age ;
Chat
[Link] = race ;
[Link] = poids;
}
static cri = "Miaou ! Miaou !";
felix [Link] [Link] miauler() {
[Link]([Link] ++ "->
[Link]([Link] "-> "Miaou ! Miaou !");
+ [Link]);
}
maigrir(deltaPoids) {
[Link] -= deltaPoids;
Chaîne de <prototypes> de l'objet felix
}
}
Voir le code
• Un membre static ne peut être
accédé via une instance de la classe (pas dans la chaîne de <prototypes>) • Un membre static est accédé via l'identifiant de la classe
[Link] → undefined [Link] → "Miaou ! Miaou !
dernière modification 15/11/2023 © ISEP-2024 alndiaye 48
Objets et ES6 : Classes – membres statiques
• Méthodes statiques
• déclaration de méthode variable préfixée par le mot clé static
• fonction rattaché à la fonction Constructeur et non pas au prototype
Personne
sophie [Link] [Link]
let sophie = new Personne("Sophie", "RAFFES", true);
let marcel = new Personne("Marcel", "TROUSP", false);
[Link]([sophie, marcel]); → Personne
-
Pour invoquer la méthode statique il faut Mme RAFFES Sophie Méthode statique se situe non pas au niveau du prototype pour les
passer par l'objet classe ( la fonction M. TROUSP Marcel Personnes mais au niveau de la fonction constructeur Personne
constructeur) Voir le code
dernière modification 15/11/2023 © ISEP-2024 alndiaye 49
Objets et ES6 : Classes - getters et setters
• Accesseurs : fonctions getters
• get permet de lier une propriété d'un objet à une fonction qui sera appelée lorsqu'on accédera à la propriété.
Méthodes transformées
en getters
let sophie = new Personne("Sophie", "RAFFES", true);
[Link]([Link]()); → 'Mme' [Link]([Link]); → 'Mme'
[Link]([Link]()); → 'RAFFES Sophie' Voir le code [Link]([Link]); → 'RAFFES Sophie'
Les getters peuvent être utilisés comme des propriétés
dernière modification 15/11/2023 © ISEP-2024 alndiaye 50
Objets et ES6 : Classes - getters et setters
• Modifieurs (fonctions setters)
• set permet de lier une propriété d'un objet à une
fonction qui sera appelée lorsqu'on affectera la propriété.
let p1 = new Personne("Sophie", "RAFFES", true);
[Link]([Link]); → 'RAFFES Sophie'
*
[Link] = " Maeva MERLIN"; Appel du setter
[Link]([Link]); → 'Maeva'
[Link]([Link]); → 'MERLIN'
On peut aussi
définir getters
et setters dans
des objets
littéraux
Voir le code Voir le code
*[Link]
dernière modification 15/11/2023 © ISEP-2024 alndiaye 51
Objets et ES6 : Classes – Concepts POO et JS
• La surcharge de méthode est interdite, un objet ne peut avoir deux propriétés avec le même nom. Il est
cependant possible de les simuler en tirant profit du nombre d'arguments variables et de valeurs par défaut,
• L'encapsulation et les différents types de visibilité (privée, protégée ou publique) ne sont pas encore proposés
dans la norme (voir Class field declarations for JavaScript proposal from D. Ehrenberg & J. Morrison). Certaines
techniques existent mais elles complexifient le code. Une autre possibilité est d'utiliser un surlangage comme
TypeScript (cependant le code JavaScript généré ne conservera pas ces contraintes...),
• Les classes abstraites et les interfaces n'existent pas encore. Il est cependant possible de les simuler en
générant une exception si le constructeur et/ou les méthodes sont appelées,
• Plusieurs classes peuvent être déclarées dans un même fichier.
dernière modification 15/11/2023 © ISEP-2024 alndiaye 52
Objets et ES6 : Classes - Héritage [Link]
• Héritage – possibilité de définir une classe comme
étendant une classe existante (sous classe)
Personne On veut exprimer le fait
nom: string qu'un employé c'est une
prenom : string personne mais qui en
feminin : boolean
plus a une fonction. [Link]
Personne(p: string,
n:string, f:boolean)
get civilite():string
get nomComplet(p): string
set nomComplet(n: string)
describe() : string Possibilité d'obtenir ce
lister(tabP : [Personne]) comportement avec les chaînes de
prototypes en JavaScript
[Link]
let p1 = new Employe("Sophie", "RAFFES", true, "Directrice");
Employe
[Link]([Link]()); → 'Mme RAFFES Sophie (Directrice)'
fonction: string
Employe(p: string,
n:string, f:boolean, [Link]([Link]); → 'Mme'
fct: string)
describe(): string
p1
dernière modification 15/11/2023 © ISEP-2024 alndiaye 53
Objets et ES6 : Classes - Héritage [Link]
• Héritage – extends permet d'exprimer cette relation
d'héritage (et de mettre en place la chaîne de prototypes)
super() appelle le constructeur de la super classe.
Cet appel doit être fait avant d'accéder à this
[Link]
[Link]() invoque une méthode héritée
[Link]
let p1 = new Employe("Sophie", "RAFFES", true, "Directrice");
console. log([Link]()); → 'Mme RAFFES Sophie (Directrice)'
console. log([Link]); → 'Mme'
Voir le code
p1
dernière modification 15/11/2023 © ISEP-2024 alndiaye 54
Objets et ES6 : Classes - Héritage [Link]
[Link]
• Héritage – extends défini aussi une
chaîne de <prototype> au niveau des
classes (fonctions constructeurs) →
héritage des membres statiques
Personne (class) [Link]
Employe (class) [Link]
let tabEmployes = [
new Employe("Sophie", "RAFFES", true, "Directrice") ,
new Employe("Marcel", "TROUSP", false, "Sous directeur")
];
[Link](tabEmployes); Voir le code
→ Employe
--------
tabEmployes
Mme RAFFES Sophie (Directrice)
M. TROUSP Marcel (Sous directeur)
dernière modification 15/11/2023 © ISEP-2024 alndiaye 84
Objets et ES6 : opérateur instaceof [Link]
• x instanceof C renvoie true si l'objet référencé par x est instance
de la classe C ou d'une sous classe de C (plus précisément si
[Link] se trouve dans la chaîne de <prototypes> de x),
false sinon
let p1 = new Employe("Sophie", "RAFFES", true, "Directrice");
p1 instanceof Employe → ??
true [Link]
p1 instanceof Personne → ??
true
p1 instanceof Object → ??
true
let p2 = new Personne("Maeva", "FASFER", true);
p2 instanceof Employe → ??
false
Employe [Link]
typeof p1 → ??
object
Nom de la classe qui a permis de créer p1
???
[Link] → Employe
p1
dernière modification 15/11/2023 © ISEP-2024 alndiaye 56
Objets JavaScript
• Quelques liens
• [Link]
• [Link]
• [Link]
• [Link]
• [Link]
dernière modification 15/11/2023 © ISEP-2024 alndiaye 57
Objets et ES6 : Classes - Héritage
• Avez-vous compris les objets et chaines de <prototype> ?
• Exercices
soit les classes Personne et Employe ci-contre
quel affichage produisent les instructions suivantes ?
Justifiez vos réponses
let tab1 = [
new Personne("Marcel", "TROUSP", false),
new Personne("Sophie", "RERHAX", true);
];
let tab2 = [
new Employe("J.M.", "FAVRE", false, 'Sous Directeur'),
new Employe("Maeva", "FARRES", true, 'Directrice');
];
let tab3 = [
new Personne("J.M.", "FAVRE", false),
new Employe("Maeva", "FARRES", true, 'Directrice');
];
[Link](tab1); → ???
[Link](tab2); → ???
[Link](tab3); → ???
dernière modification 15/11/2023 © ISEP-2024 alndiaye 58
Objets et ES6 : Classes
• Avez-vous compris les objets et chaines de <prototype> ?
• Exercices
soit les classes Personne et Employe ci-contre
quel affichage produisent les instructions suivantes ?
Justifiez vos réponses
const p1 = new Personne("Marcel", "TROUSP", false);
const p2 = new Employe("Sophie", "RAFFES", true, "Directrice");
[Link]([Link]()); → ???
[Link]([Link]()); → ???
[Link] = 'Sous Directeur';
[Link]([Link]()); → ???
delete [Link];
[Link]([Link]()); → ???
const p3 = new Personne("J.M.", "FAVRE", false, "Directeur Général");
[Link]([Link]()); → ???
const p4 = new Employe("Maeva", "RAFFES", true);
[Link]([Link]()); → ???
dernière modification 15/11/2023 © ISEP-2024 alndiaye 59
Objets et ES6 : Classes
• Avez-vous compris les objets et chaines de <prototype> ?
• Exercices
soit les classes Personne et Employe ci-contre
quel affichage produisent les instructions suivantes ?
Justifiez vos réponses
const p1 = new Personne("Marcel", "TROUSP", false);
const p2 = new Employe("Sophie", "RAFFES", true, "Directrice");
[Link]([Link]()); → ???
M. TROUSP Marcel
[Link]([Link]()); → ???
Mme RAFFES Sophie (Directrice)
[Link] = 'Sous Directeur';
[Link]([Link]()); → ???
M. TROUSP Marcel
delete [Link];
[Link]([Link]()); → ???
Mme RAFFES Sophie (undefined)
const p3 = new Personne("J.M.", "FAVRE", false, "Directeur Général");
[Link]([Link]()); → M.
???FAVRE J.M.
const p4 = new Employe("Maeva", "RAFFES", true);
[Link]([Link]()); → Mme
??? RAFFES Maeva (undefined)
dernière modification 15/11/2023 © ISEP-2024 alndiaye 60
Objets et ES6 : Classes
• Avez-vous compris les objets et chaines de <prototype> ?
• Exercices
soit les classes Personne et Employe ci-contre
quel affichage produisent les instructions suivantes ?
Justifiez vos réponses
let tab1 = [
new Personne("Marcel", "TROUSP", false),
new Personne("Sophie", "RERHAX", true)
];
let tab2 = [
new Employe("J.M.", "FAVRE", false, 'Sous Directeur'),
new Employe("Maeva", "FARRES", true, 'Directrice')
];
let tab3 = [
new Personne("J.M.", "FAVRE", false),
new Employe("Maeva", "FARRES", true, 'Directrice')
];
Personne
--------
[Link](tab1); → ???
M. TROUSP Marcel Employe
Mme RERHAX Sophie --------
[Link](tab2); → ??? M. FAVRE J.M. (Sous Directeur)
Mme FARRES Maeva (Directrice)
Employe
[Link](tab3); → ???
--------
M. FAVRE J.M.
Mme FARRES Maeva (Directrice)
dernière modification 15/11/2023 © ISEP-2024 alndiaye 61