Tutorat en bio-informatique Le 14 novembre 2012
Au programme… Les objets –Propriétés (attributs) –Constructeurs –Méthodes
Avant de commencer… JavaScript supporte la programmation orientée objet (comme C++ et Java) Ce ne sont pas tous les langages de programmation qui permettent l'utilisation d'objets (C par exemple)
Les objets On peut se servir des objets (en programmation) pour représenter des objets concrets : –table, voiture, étudiant, compte bancaire, etc. On peut également définir des objets pour représenter des structures de notre programme : –liste, nœud (d'une liste), arbre, etc.
Les objets On peut créer un objet table de la façon suivante : var table = {largeur: 50, longueur: 75, hauteur: 60}; ou encore de cette façon, plus verbeuse : var table = new Object(); table.largeur = 50; table.longueur = 75; table.hauteur = 60;
Les objets Ici, 'table' est un objet spécifique (avec des propriétés définies). On peut accéder aux propriétés (en lecture ou en écriture) de deux façons : var table = {largeur: 50, longueur: 75, hauteur: 60}; print(table.largeur); //façon 1 print(table["longueur"]); //façon 2, un peu comme un tableau
Les objets Contrairement aux noms de variables, on peut utiliser des espaces dans les noms des propriétés. Il faut par contre utiliser les guillemets et la façon "tableau" pour y accéder : var pizza = {prix: 12.99, "nom de pizza": "hawaïenne"} print(pizza.prix); print(pizza."nom de pizza"); //ERREUR! print(pizza["nom de pizza"]); //OK
Les objets On peut vérifier si un propriété existe avec l'instruction 'in' : var pizza = {prix: 12.99, "nom de pizza": "hawaïenne"} if("prix" in pizza) print("Le prix est " + pizza.prix); Le nom de la propriété doit être entre guillemets
Les objets On peut aussi parcourir toutes les propriétés d'un objet avec une boucle for et l'instruction in var pizza = {prix: 12.99, "nom de pizza": "hawaïenne"} for(var prop in pizza) { print(prop + " = " + pizza[prop]) } imprime :prix = nom de pizza = hawaïenne
Les objets Les objets utilisés comme on vient de le voir sont parfaits pour représenter des dictionnaires : var dictioAngFr = {hi: "salut", "good morning": "bonjour"}; var motAng = "hi"; if(motAng in dictioAngFr) var motFr = dictioAngFr[motAng];
Les objets Le problème avec la création d'objets comme on vient de le voir, c'est que l'objet créé n'est pas réutilisable On ne peut pas créer rapidement plusieurs 'versions' du même type d'objet : var pizza1 = {prix: 12.99, "nom de pizza": "hawaïenne"} var pizza2 = {prix: 11.49, "nom de pizza": "pepperoni"} var pizza3 = {prix: 10.99, "nom de pizza": "fromage"} …
Les objets Nous allons maintenant voir comment créer un "modèle" (ou prototype) d'objet réutilisable Nous verrons également comment y associer des méthodes
Les objets On dit d'un objet en particulier qu'il s'agit d'une instance En effet, une instance d'un objet se conforme au modèle d'un prototype (possède les propriétés définies dans le prototype)
Les objets Exemple : –Soit un objet "table". Le modèle (prototype) d'une table contient les propriétés suivantes : largeur longueur hauteur –Une instance de l'objet table sera une table en particulier, avec sa largeur, sa longueur et sa hauteur
Les objets Pourquoi utiliser des objets? –On peut stocker un grand nombre d'informations différentes dans un seul objet –On peut définir des méthodes propres aux instances d'un objet (compartimentalisation du code)
Les propriétés On appelle propriétés les 'variables' qui sont associées à un objet Chaque instance d'un objet possèdera une valeur spécifique pour chacune de ses propriétés C'est ce qui fait que chaque instance est différente (tout en faisant partie du même prototype d'objets)
Constructeurs Lorsqu'on veut définir un modèle d'objets réutilisable, on utilise un constructeur La déclaration et l'initialisation des propriétés se fait normalement dans le constructeur, quoiqu'on peut à tout moment ajouter des propriétés à un objet déjà défini
Constructeurs Un constructeur est une fonction spéciale qui sert à instancier un objet Ils peuvent également servir à accomplir des tâches qui doivent être faites lors de la création de l'objet (écriture dans la console, calcul d'une valeur en fonction des propriétés, etc.)
Constructeurs Un constructeur doit être défini de cette façon : function NomDuTypeObjet(paramètres) { … } Le nom du constructeur doit (par convention) commencer par une lettre majuscule (permet de faire la différence entre une fonction normale et un constructeur)
Constructeurs Exemple : function Table(largeur, longueur, hauteur) { this.largeur = largeur; this.longueur = longueur; this.hauteur = hauteur; } Le mot réservé 'this' représente une variable spéciale qui pointe sur l'instance courante. Cela nous permet d'accéder aux propriétés de l'instance à l'intérieur du constructeur (et des méthodes) On n'utilise pas 'var' pour déclarer les propriétés, mais on utilise 'this'
Constructeurs La déclaration d'un objet se fait comme celle d'une variable ordinaire : –var table; L'instanciation se fait à l'aide du constructeur et du mot réservé 'new' : –var petiteTable = new Table(25, 35, 45); –var grandeTable = new Table(55, 75, 100);
Méthodes Les méthodes sont des fonctions associées à des instances d'objets Elles sont appelées sur des instances et ont accès aux valeurs des propriétés de l'instance Appel à l'extérieur de du constructeur : instance.methodeDinstance(); Appel à l'intérieur du constructeur : this.methodeDinstance();
Méthodes On définit des méthodes à l'intérieur du constructeur, de la même manière que les propriétés (en fait, les méthodes sont des propriétés de type 'function') : function Etudiant(nom, niveau) { this.nom = nom; this.niveau = niveau; this.changeNiveau = function(nouveauNiv) { this.niveau = nouveauNiv; }; }
Méthodes Exemple complet : function Etudiant(nom, niveau) { this.nom = nom; this.niveau = niveau; this.changeNiveau = function(nouveauNiv) { this.niveau = nouveauNiv; }; } var etud = new Etudiant("Rodrigo", "Maîtrise"); //Construction etud.changeNiveau("Doctorat"); //Appel de la méthode
Méthodes Il est possible d'ajouter des nouvelles méthodes après la définition du constructeur (en dehors du constructeur) On va alors ajouter les nouvelles méthodes au prototype de l'objet
Méthodes function Etudiant(nom, niveau) { this.nom = nom; this.niveau = niveau; this.changeNiveau = function(nouveauNiv) { this.niveau = nouveauNiv; }; } var etud = new Etudiant("Rodrigo", "Maîtrise"); //Construction etud.changeNiveau("Doctorat"); //Appel de la méthode Etudiant.prototype.imprime = function() { print("Etudiant : " + this.nom + ", " + this.niveau); };
Création d’un objet Lors de la création d'une instance, un espace mémoire est réservé pour stocker les valeurs des propriétés. Ici, 't' contient la référence (adresse) vers l'objet. var t = new Table(2, 3, 4); Largeur Longueur Hauteur Adresse mémoire
Création d’un objet var t = new Table(2, 3, 4); Largeur Longueur Hauteur Adresse mémoire 1
Création d’un objet var t = new Table(2, 3, 4); t = new Table(2, 3, 4); Largeur Longueur Hauteur Adresse mémoire 1 Largeur Longueur Hauteur Adresse mémoire 2
Copie d’un objet On ne peut pas copier des objets (et des tableaux) de la même façon que des nombres et des strings : var a = 55; var b = a; //Erreur logique! var t = new Table(2, 3, 4); var t2 = t; //Erreur logique! De cette façon, on ne fait qu'obtenir 2 pointeurs vers la même instance! Largeur (2) Longueur (3) Hauteur (4) Adresse mémoire t t2
Copie d’un objet Pour copier correctement un objet (ou un tableau), il faut créer un nouvel objet qui aura les mêmes valeurs de propriétés (ou les mêmes valeurs dans les cases du tableau) On peut créer une méthode pour créer une vraie copie des objets
Copie d’un objet function Etudiant(nom, niveau) { this.nom = nom; this.niveau = niveau; this.changeNiveau = function(nouveauNiv) { this.niveau = nouveauNiv; }; this.clone = function() { return new Etudiant(this.nom, this.niveau); }; } var etu = new Etudiant("Georges", "Secondaire"); var etuCopie = etu.clone();
Comparaison de deux objets La comparaison suivante compare uniquement les références et non pas les valeurs des propriétés : if (t1 == t2) Afin de vérifier si deux objets sont identiques, il faut plutôt vérifier si les valeurs de leurs propriétés sont identiques
Comparaison de deux objets function Etudiant(nom, niveau) { this.nom = nom; this.niveau = niveau; this.estIdentique = function(autreEtud) { return this.nom == autreEtud.nom && this.niveau == autreEtud.niveau; }; } var etu = new Etudiant("Georges", "Secondaire"); var etuCopie = etu.clone(); if(etu.estIdentique(etuCopie)) print("Ils sont identiques!!");
Les objets Les objets sont en quelques sortes des types que vous créez Les objets peuvent donc être employés comme : –propriétés –paramètres –valeurs de retour
Objets comme paramètres Avec les nombres et les strings, on passe en paramètre une copie de la valeur Avec les objets (et les tableaux), on passe en paramètre une copie de la référence
Objets comme paramètres Si on modifie les valeurs des propriétés du paramètre formel, les valeurs des propriétés du paramètre actuel sont modifiées aussi Si on modifie la référence du paramètre formel, on ne modifie pas la référence du paramètre actuel
Objets comme paramètres function Etudiant(nom, niveau) { this.nom = nom; this.niveau = niveau; this.modifieRef = function(autreEtud) { autreEtud = new Etudiant("Bill", "Cegep"); }; } La fonction modifieRef n'aura aucun effet sur le paramètre actuel
Exercice 1 Créez un constructeur pour l'objet Table, possédant comme propriétés une largeur, une longueur et une hauteur. Créez un constructeur possédant 3 paramètres (largeur, longueur, hauteur). Ajoutez une méthode calculeAire() dans le constructeur qui retournera l’aire de la table. Ajoutez une méthode imprime() en dehors du constructeur qui imprimera une description de la table.
Exercice 1 (réponse) function Table(largeur, longueur, hauteur) { this.largeur = largeur; this.longueur = longueur; this.hauteur = hauteur; this.calculeAire = function() { return this.largeur * this.longueur; }; } Table.prototype.imprime = function() { print("Largeur = " + this.largeur + ", longueur = " + this.longueur + ", hauteur = " + this.hauteur + ", aire = " + this.calculeAire()); };
Exercices 2 et 3 (MAT1400) Chapitre 11.7, Analyse - concepts et contextes vol. 2 27) Cherchez le maximum et le minimum absolu de f sur l'ensemble D., D est la région bornée par la parabole et la droite. 35) Déterminez trois nombres positifs dont la somme vaut 100 et dont le produit est maximum.