JeuWeb - Crée ton jeu par navigateur
Réflexion nocture : l'encaspulation en Javascript - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Réflexion nocture : l'encaspulation en Javascript (/showthread.php?tid=5980)

Pages : 1 2


Réflexion nocture : l'encaspulation en Javascript - Maks - 18-02-2012

var Foo = function() {

this.attribut1 = 0;
this.attribut2 = "texte";

var self = this; // conservation du contexte

return Foo.prototype;
};

Foo.prototype = {
method1: function() { alert('method1 ok'); },
getAttribut1: function() { return self.attribut; },
setAttribut1: function(value) { self.attribut = value; }
};

var bar = new Foo();

alert(bar.attribut1); // undefined

bar.method1(); // renvoie method1 ok
bar.setAttribut1(3); // met bar.attribut1 à 3
alert(bar.getAttribut1()); // renvoie bar.attribut1


Je viens de gribouiller ça sur JSBin ^^

Sympa non ?
J'essaie de trouver des tricks pour me rapprocher de la POO de Java et PHP ^^


RE: Réflexion nocture : l'encaspulation en Javascript - Angelblade - 18-02-2012

Euh je comprend pas ce que tu essaye de faire


RE: Réflexion nocture : l'encaspulation en Javascript - Sephi-Chan - 18-02-2012

N'utilisez pas la balise code toute seule : spécifiez le langage avec code=javascript !

Je ne comprends pas bien l'intérêt de faire ressembler Javascript avec les langages orientés objet alors qu'il ne l'est pas (il est orienté prototype). Autant apprendre à l'utiliser avec ses spécificités, non ?

Ou alors utiliser un outil comme CoffeeScript, ça rend l'écriture de Javascript très plaisante et infiniment plus concise, c'est très agréable quand on fait des applications riches en Javascript (avec Backbone, par exemple). Smile


RE: Réflexion nocture : l'encaspulation en Javascript - Maks - 18-02-2012

(18-02-2012, 09:02 AM)Angelblade a écrit : Euh je comprend pas ce que tu essaye de faire

J'ai rendu les attributs de la classe Foo privés et mis en place des setter et getter Wink

Sephi > Oui ça n'est qu'une petite réflexion Smile
Seulement avoir choisi de ne proposer que des attributs publics dans les classes c'est quand même discutable, en tout cas quand on vient de PHP/Java ect ça choque un peu ^^ Le modèle "objet" n'est pas très riche.

CoffeeScript ça m'a l'air cool en effet, y'a une syntaxe pour l'héritage en plus notamment, une sorte de JS amélioré.


RE: Réflexion nocture : l'encaspulation en Javascript - Sephi-Chan - 18-02-2012

(18-02-2012, 01:09 PM)Maks a écrit : Sephi > Oui ça n'est qu'une petite réflexion Smile
Seulement avoir choisi de ne proposer que des attributs publics dans les classes c'est quand même discutable, en tout cas quand on vient de PHP/Java ect ça choque un peu ^^ Le modèle "objet" n'est pas très riche.

Ce n'est pas pertinent de façonner les outils existant parce que tu n'en as pas l'habitude.

À vouloir donner un comportement contre-nature à Javascript, tu vas lui faire perdre sa puissance qui vient des mécanismes auxquels tu n'es pas habitué.

L'alternative est de se tourner vers des langages alternatifs. Pour les langages browser-side, c'est un peu embêtant mais on arrive malgré ça à avoir des alternatives comme CoffeeScript ou Dart, qui sont compilés en Javascript.


(18-02-2012, 01:09 PM)Maks a écrit : CoffeeScript ça m'a l'air cool en effet, y'a une syntaxe pour l'héritage en plus notamment, une sorte de JS amélioré.

CoffeeScript génère du Javascript tout simple : il ne fournit aucun runtime. Il faut rester prudent concernant certains mécanismes.


RE: Réflexion nocture : l'encaspulation en Javascript - Maks - 18-02-2012

Je n'ai aucun problème avec le modèle objet (ou prototypal) actuel de JS, que je maitrise très bien. D'ailleurs dans mon exemple il est intégralement conservé.
Si je suis ton raisonnement, alors les closures sont aussi une utilisation contre-nature de Javascript ?


RE: Réflexion nocture : l'encaspulation en Javascript - Sephi-Chan - 18-02-2012

Je parle de manière générale de la volonté de transformer Javascript en langage objet classique, pas de ce cas en particulier. Wink

Et au contraire, l'utilisation des closures fait partie de ces choses déroutante quand on commence à jouer avec Javascript mais qui est en réalité un mécanisme très puissant.

Javascript, c'est cool. Smile


RE: Réflexion nocture : l'encaspulation en Javascript - Maks - 18-02-2012

Oui, on trouve plein de codes farfelus sur le web pour simuler certaines choses en objet "classique" en JS. Je trouvais mon exemple plutôt simple à comprendre plutôt que des choses comme : http://ejohn.org/blog/javascript-getters-and-setters/

Au passage pour hériter des attributs privés, il suffira de faire Foo.call(this);
Je n'ai fait qu'une simple closure (mot-clé return) en réalité donc rien d'exotique Wink

Après loin de moi l'idée de lancer les hostilités contre JS, qui reste mon langage préféré Smile


RE: Réflexion nocture : l'encaspulation en Javascript - Angelblade - 18-02-2012

Ah okkkk.

Chuis pas sur de l'utilité mais intéressant


RE: Réflexion nocture : l'encaspulation en Javascript - niahoo - 18-02-2012

Mouais, pour quelqu'un qui maitrise "très bien" le modèle objet de javascript, tu devrais tester ton code avant de nous le montrer, histoire qu'on apperenne pas des bêtises

var Foo = function() {

this.attribut1 = 0;
this.attribut2 = "texte";

var self = this; // conservation du contexte

return Foo.prototype;
};

Foo.prototype = {
method1: function() { alert('method1 ok'); },
getAttribut1: function() { return self.attribut; },
setAttribut1: function(value) { self.attribut = value; }
};

var bar = new Foo();



//bar.method1(); // renvoie method1 ok
bar.setAttribut1(1234); // met bar.attribut1 à 1234 => NON !

alert(attribut);
alert(window.attribut);

déjà ta fonction setAttribut1 traffique self.attribut et non pas self.attribut1. Ensuite tu définis ta variable dans la fonction Foo,donc quand tu en modifies ensuite le prototype, tu n'est plus dans le même scope. La variable self que tu modifies est l'objet window, précisément window.self qui référence window