0% ont trouvé ce document utile (0 vote)
8 vues61 pages

Introduction aux Objets en JavaScript

Ce document présente une introduction aux objets en JavaScript, en expliquant la différence entre les types primitifs et les types objets. Il aborde également la syntaxe littérale pour définir des objets, l'accès aux propriétés d'un objet, ainsi que la modification de ces propriétés. Enfin, il traite des objets en tant que paramètres de fonction et des méthodes associées à leur manipulation.

Transféré par

dioumadione004
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
8 vues61 pages

Introduction aux Objets en JavaScript

Ce document présente une introduction aux objets en JavaScript, en expliquant la différence entre les types primitifs et les types objets. Il aborde également la syntaxe littérale pour définir des objets, l'accès aux propriétés d'un objet, ainsi que la modification de ces propriétés. Enfin, il traite des objets en tant que paramètres de fonction et des méthodes associées à leur manipulation.

Transféré par

dioumadione004
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi