Portée des objets ECMAScript
- Page précédente Type d'objet
- Page suivante Définir une classe ou un objet
La portée fait référence à la portée d'une variable.
Portée publique, privée et protégée
Concept
Dans la conception de programmes orientés objet traditionnelle, on se concentre principalement sur les portées publiques et privées. Les attributs des objets dans la portée publique peuvent être accédés à partir de l'extérieur de l'objet, c'est-à-dire après que le développeur ait créé une instance de l'objet, il peut utiliser ses attributs publics. Les attributs dans la portée privée ne peuvent être accédés que depuis l'intérieur de l'objet, c'est-à-dire pour le monde extérieur, ces attributs n'existent pas. Cela signifie que si une classe définit des attributs et des méthodes privés, ses sous-classes ne peuvent pas accéder à ces attributs et méthodes.
La portée protégée est également utilisée pour définir des attributs et des méthodes privés, mais ces attributs et méthodes peuvent également être accédés par les sous-classes.
ECMAScript n'a qu'une portée publique
Il n'a presque aucune signification de discuter de ces portées ECMAScript, car ECMAScript ne possède qu'une seule portée - la portée publique. Tous les attributs et méthodes de tous les objets ECMAScript sont publics. Par conséquent, lors de la définition de classes et d'objets personnels, il faut être particulièrement prudent. Souvenez-vous que tous les attributs et méthodes sont par défaut publics !
Solution proposée
De nombreux développeurs ont proposé des modèles de portée d'attributs efficaces en ligne, résolvant ainsi ce problème ECMAScript.
En raison du manque de portée privée, les développeurs ont déterminé une convention pour indiquer quels attributs et méthodes devraient être considérés comme privés. Cette convention stipule d'ajouter des traits de soulignement avant et après les attributs :
obj._color_ = "blue";
Dans ce code, la propriété color est privée. Notez que le trait de soulignement ne change pas le fait que la propriété soit une propriété publique, il ne fait que dire aux autres développeurs que cette propriété devrait être considérée comme privée.
Certains développeurs aiment également utiliser une ligne oblique pour indiquer les membres privés, par exemple : obj._color.
Portée statique
Les attributs et les méthodes définis par la portée statique peuvent toujours être accédés à partir du même endroit. Dans Java, une classe peut avoir des attributs et des méthodes sans avoir à instancier l'objet de cette classe, par exemple java.net.URLEncoder, dont la fonction encode() est une méthode statique.
ECMAScript n'a pas de portée statique
En termes stricts, ECMAScript n'a pas de portée statique. Cependant, il peut fournir des attributs et des méthodes aux constructeurs. Souvenez-vous, les constructeurs ne sont que des fonctions. Les fonctions sont des objets, et les objets peuvent avoir des attributs et des méthodes. Par exemple :
function sayHello() { alert("hello"); } sayHello.alternate = function() { alert("hi"); } sayHello(); // Affiche "hello" sayHello.alternate(); // Affiche "hi"
Ici, la méthode alternate() est en réalité la méthode de la fonction sayHello. Vous pouvez appeler sayHello() comme une fonction conventionnelle pour afficher "hello", ou appeler sayHello.alternate() pour afficher "hi". Même ainsi, alternate() est une méthode de l'aire d'action publique de sayHello() et non une méthode statique.
Le mot-clé this
La fonction de this
L'un des concepts les plus importants à maitriser en ECMAScript est l'utilisation du mot-clé this, qui est utilisé dans les méthodes d'objet. Le mot-clé this fait toujours référence à l'objet appelant la méthode, par exemple :
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(this.color); }; oCar.showColor(); // Affiche "red"
Dans le code ci-dessus, le mot-clé this est utilisé dans la méthode showColor() de l'objet. Dans cet environnement, this vaut oCar. Le code suivant a la même fonction que celui ci-dessus :
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(oCar.color); }; oCar.showColor(); // Affiche "red"
Les raisons d'utiliser this
Pourquoi utiliser this ? Parce que lors de l'instanciation d'un objet, on ne peut jamais être sûr des noms de variables que le développeur utilisera. En utilisant this, vous pouvez réutiliser la même fonction à plusieurs endroits. Réfléchissez à l'exemple suivant :
function showColor() { alert(this.color); }; var oCar1 = new Object; oCar1.color = "red"; oCar1.showColor = showColor; var oCar2 = new Object; oCar2.color = "blue"; oCar2.showColor = showColor; oCar1.showColor(); //sortie "red" oCar2.showColor(); //sortie "blue"
Dans le code ci-dessus, la fonction showColor() est définie avec this, puis deux objets (oCar1 et oCar2) sont créés. L'attribut color de l'un des objets est défini sur "red", et l'attribut color de l'autre objet est défini sur "blue". Les deux objets ont l'attribut showColor, qui pointe vers la fonction showColor () originale (notez que ici il n'y a pas de problème de nommage, car l'un est une fonction globale et l'autre est une propriété de l'objet). Appel de showColor() pour chaque objet, la sortie de oCar1 est "red", et la sortie de oCar2 est "blue". Cela est dû au fait que lors de l'appel oCar1.showColor(), le mot-clé this dans la fonction est égal à oCar1. Lors de l'appel oCar2.showColor(), le mot-clé this dans la fonction est égal à oCar2.
Attention, pour référencer les propriétés d'un objet, il est obligatoire d'utiliser le mot-clé this. Par exemple, si vous utilisez le code suivant, la méthode showColor() ne peut pas fonctionner :
function showColor() { alert(color); };
Si vous ne n'utilisez pas l'objet ou le mot-clé this pour référencer une variable, ECMAScript le considère comme une variable locale ou globale. Ensuite, la fonction cherche une variable locale ou globale nommée color, mais ne la trouve pas. Que se passe-t-il ? La fonction affichera "null" dans l'alerte.
- Page précédente Type d'objet
- Page suivante Définir une classe ou un objet