Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Dans le chapitre précédent j'ai évoqué les objets natifs de JavaScript : les Dates, les objets String, les objets Math, etc.
Dans cette page je vais vous montrer comment créer vos propres objets et les manipuler.
Un constructeur est simplement une fonction définissant un objet, ses propriétés et méthodes.
Dans ce premier exemple l'objet ne comprend que des propriétés.
// création de l'objet voiture avec 4 propriétéw function voiture(marque,modele, puissance, motorisation) { this.marque = marque; this.modele = modele; this.puissance = puissance; this.motorisation = motorisation; } // création d'instances de voiture var auto_jean = new voiture('Peugeot', '2008 série2', '130CV', 'essence'); var auto_paul = new voiture('Renault', 'clio 4', '90CV','diesel'); // affichage d'instances avec leurs propriétés alert("Voiture de jean : " + auto_jean.marque +" " + auto_jean.modele); alert(`Voiture de paul : ${auto_paul.puissance} et ${auto_paul.motorisation} `);
L'objet créé se nomme "voiture" et comprend 4 propriétés.
Je crée ensuite deux instances de l'objet : auto_jean & auto_paul.
On peut dire aussi que l'on crée deux objets de la classe "voiture".
Notez l'emploi de la notation pointée : objet.propriété.
Dans la dernière instruction j'utilise la notation "template strings" pour éviter une concaténation fastidieuse.
Dans l'exemple précédent les objets ne comprenaient que des propriétés or si on veut manipuler une objet ce dernier doit comprendre aussi au moins une méthode. Une méthode est une fonction propre à l'objet.
function voiture(marque,modele, puissance, motorisation) { this.marque = marque; this.modele = modele; this.puissance = puissance; this.motorisation = motorisation; this.presenter = function() { var presenter = this.marque + " - " + this.modele + " - " + this.puissance + " - " + this.motorisation; return presenter ; } } // création d' instances de voiture var ma_voiture = new voiture('Renault', 'clio 4', '90CV','diesel'); var auto_felix = new voiture('Peugeot', '2008 série2', '130CV', 'essence'); // appel de la méthode presenter alert("Ma voiture : " + ma_voiture.presenter()); alert("Voiture de Felix : " +auto_felix.presenter()); //changement de propriétés ma_voiture.marque ="Porsche" ; ma_voiture.modele ="Panamera"; ma_voiture.puissance ="330CV" ; alert("La voiture dont je rêve : " + ma_voiture.presenter()); // notation avec crochets alert(ma_voiture['marque'] + " " + ma_voiture['modele'] +" " + ma_voiture['motorisation'])
L'objet créé se nomme voiture et comprend 4 propriétés et une méthode.
Je crée deux instance de voiture.
La méthode se nomme presenter(). Il s'agit d'une fonction propre à l'objet qui affiche ici toutes les propriétés de l'objet.
Pour décrire une méthode il faut employer les mots réservés function et return.
Pour appeler une méthode d'un objet il faut employer la syntaxe : objet.methode().
N'oubliez pas les parenthèses, une méthode c'est une fonction !
Je procède ensuite à un changement de propriétés pour l'instance "mavoiture".
Notez la syntaxe pour modifier la valeur d'une propriété : objet.propriété ="nouvelle valeur".
On dit que l'on utilise la notation pointée.
Pour accéder / modifier la valeur d'une propriété il existe aussi une autre solution : la notation entre crochets. La syntaxe est alors : objet['propriété'].
La notation entre crochets ne fonctionne pas pour les méthodes.
En POO classique, une classe est la description d'un objet.
La classe définit donc les propriétés et les méthodes de l'objet.
Pour se rapprocher de la syntaxe objet des autres langages, la version ECMAScript de 2015 introduit les classes.
Dans l'exemple qui suit je vais définir un objet via une classe. Je vais aussi créer une deuxième classe héritant de la première.
Je vais créer des instances de la classe mère et de la classe fille.
Je vais aussi évoquer la notation pointée optionnelle ...
// création de la classe auto class Auto{ constructor(marque,modele,puissance,motorisation) { this.marque = marque; this.modele = modele; this.puissance = puissance; this.motorisation = motorisation; } } // fin définition classe var auto_pierre = new Auto("Citroen", "C3", "80CV","electrique"); console.log("Auto de pierre : " + auto_pierre.marque + " - " + auto_pierre.modele); // classe Tacot hérite de la classe Auto class Tacot extends Auto { constructor(marque,modele,puissance,motorisation,annee,etat) { super(marque,modele,puissance,motorisation); // nouvelles propriétés this.annee = annee; this.etat = etat; // nouvelle méthode this.presenter = function() { var infos = this.marque + " "+ this.modele + " " + this.puissance + " " + this.motorisation + " " + this.annee + " "+ this.etat ; return infos ; } } } // fin définition classe var tacot_henri = new Tacot('Citroen', 'traction avant','50CV', 'essence', '1940', 'épave'); alert("Tacot de Henri : " + tacot_henri.presenter()); var tacot_jacques = new Tacot('Renault', '4CV','35CV', 'essence', '1950', 'restauré'); alert("Tacot de Jacques : " + tacot_jacques.presenter()); // notation pointée optionnelle alert("Auto de pierre :" + auto_pierre.marque +"-"+ auto_pierre.modele + "-" + auto_pierre?.annee +"-" + auto_pierre?.etat);
Je définis donc la classe "Auto" . Il est d'usage que la première lettre de la classe soit une majuscule.
La fonction constructor() initialise les propriétés et méthodes.
Notez que la classe "Auto" ne comprend que des propriétés.
A partir de la classe "Auto" je définis la classe "Tacot" par héritage avec l'instruction class Tacot extends Auto.
La fonction super() reprend la structure de la classe mère.
Dans cette nouvelle classe je définis deux nouvelles propriétés (annee & etat) et une méthode nommée "presenter()".
Je crée deux instances de la classe "Tacot" et j'affiche toutes leurs propriétés via la méthode "presenter()".
Pour la dernière instruction alert j'utilise la notation pointée optionnelle.
Je ne sais plus si l'instance auto_pierre appartient à la classe mère "Auto" OU à la classe fille "Tacot.
Il n'est donc pas certain que l'objet "auto_pierre" possède les propriétés "annee" et "etat".
J'utilise donc pour ces deux propriétés la notation optionnelle : caractères ?. entre objet et propriété.
Grâce à cette syntaxe il n'y a pas plantage du script mais simplement affichage éventuel de "undefined" comme
vous le constatez dans le rendu ci-dessous.
Le JSON (JavaScript Object Notation) est un format standardisé de représentation des données.
Ce format est nativement reconnu par tous les navigateurs.
Il est aussi compris par d'autres langages de programmation que JS.
Un objet JSON est un ensemble de couples propriéte:valeur.
Les couples sont séparés par une virgule. Entre la propriété et sa valeur un double point.
La syntaxe JSON permet de créer un objet (avec ses attributs et méthodes) très facilement.
On dit que l'on crée un objet littéral.
var moi = { nom : 'Darcheville', prenom : 'Patrick', age :'âgé', presenter:function() { alert(this.nom + " " + this.prenom + " " + this.age); }, }; // fin définition objet moi moi.presenter();
Dans un script je crée un objet "bar" avec des propriétés et une méthode en utilisant la notation JSON.
Pour certaines propriétés il peut y avoir plusieurs valeurs.
La méthode "fiche" génère du code HTML ...
L'objet bar décrit ce poisson osseux à la chaire succulente.
L'objet comprend 5 propriétés et une méthode fiche().
Attention la propriété "vernaculaires" a deux valeurs d'où l'emploi des crochets pour indiquer que la valeur est un "array".
La méthode "fiche" génère du code HTML pour afficher toutes les propriétés y compris l'image.
Observez très attentivement les trois dernières instructions du script :
La méthode keys appliquée sur Object retourne un tableau contenant toutes les clés de l'objet.
La méthode values appliquée sur Object retourne un tableau contenant toutes les valeurs de l'objet.
La méthode entries appliquée sur Object retourne un tableau contenant toutes les couples clé/valeur
Affichez la console !
Dans le cadre de l'API Canvas (qui permet de dessiner dans la page web) j'utilise très souvent la POO.
À chaque fois je définis un objet avec ses propriété et une méthode pour le dessiner dans le canevas.
API Canvas & POO
Vous connaissez les tableaux indicés ne comprenant que des valeurs basiques (chaînes de caractères ou nombres). Je vais vous montrer maintenant comment produire des tableaux d'objets donc un ensemble structuré de données.
On définit une classe puis on crée des instances de cette classe et enfin on regroupe tous ces objets dans un tableau indicé.