JeuWeb - Crée ton jeu par navigateur
[JS] Pas de classe = pas d'héritage, alors comment hierarchiser? - 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 : [JS] Pas de classe = pas d'héritage, alors comment hierarchiser? (/showthread.php?tid=6737)



[JS] Pas de classe = pas d'héritage, alors comment hierarchiser? - Argorate - 26-03-2013

Bonjour,

je souhaite rajouter des PNJs sur mes maps.
J'ai une "classe" JS Character, que j'utilise pour le joueur pour l'instant.
Le truc c'est que les PNJs sont des Characters, mais auront sans doute des choses en plus que l'objet de base.
Donc, en l’absence d'héritage, comment faire pour éviter la duplication de code et l'organisation des structures de données?

Une piste?
Avec le $.extend() de jQuery, peut on faire en sorte de simulé un héritage?


Voilà, j'écoute vos suggestions/retour d'experiance.

merci.


RE: [JS]Pas de classe = pas d'héritage, alors comment hierarchiser? - Xenos - 26-03-2013

Réaliser un héritage en JS
C'est suffisant pour les héritages simples.
Pour JQuery, je sais pas.


RE: [JS]Pas de classe = pas d'héritage, alors comment hierarchiser? - Argorate - 26-03-2013

j'aime pas du tout le principe de définir les méthodes en dehors des classes en rajoutant "prototype", c'est juste moche et pas a ça place pour moi.^^

Si j'ai parlé de jQuery, c parce que le $.extend() permet de fusionner toutes les variables entres deux objets, cela inclue donc les attributs mais aussi les méthodes puisqu'en JS les fonctions sont stocker dans des variables.
Mais ça me parait bourrin de tout recopier à chaque fois (et peut etre long? et sans doute couteux en mémoire), je voulais donc savoir s'il y a une meilleur façon de faire?

Pour la méthode avec la lib prototype, je trouve ça plus moche que $.extend(), et puis je préfère éviter d'inclure une lib juste pour ça.


RE: [JS]Pas de classe = pas d'héritage, alors comment hierarchiser? - Xenos - 26-03-2013

Si tu veux de l'héritage propre, avec JS, c'est mal barré Wink
Essaie plutôt des langages alternatifs comme Dart ou CoffeeScript, qui compile vers le javascript, mais gardent des syntaxes plus sympathiques.


RE: [JS]Pas de classe = pas d'héritage, alors comment hierarchiser? - niahoo - 26-03-2013

Tu peux faire de l'héritage propre en js, il suffit de savoir le faire. Il faut utiliser le prototype. Voici un exemple qui vous parlera puisqu'il utilise la syntaxe OO (le mot-clé new)


MaClasse = {say_hello:function(){ console.log("hello, i'm ",this.name); } }
// Object {say_hello: function}
var Player = function(name) { this.name = name };
// undefined
Player.prototype = MaClasse
// Object {say_hello: function}
var John = new Player('joe');
// undefined
John.say_hello()
// hello, i'm joe

Mais si tu veux pouvoir avoir des variables (et donc des fonctions) private, voilà comment je fais un constructeur :

var Player = function(name) {
var name = name;
return {
say_hello: function () {
console.log("hello, i'm", name);
}
}
};
// undefined
var Jack = Player('jackie')
// undefined
Jack.say_hello()
// hello, i'm jackie

Maintenant j'aimerais connaître l'impact mémoire du fait de redéfinir la fonction say_hello pour chaque instance et comment c'est optimisé.

(edit:exemples tirés de la console donc pas forcément super niveau syntaxe)

Ah oui et j'oubliais le plus important : dire "Pas de classe = pas d'héritage" c'est FAAUUUUX !


RE: [JS]Pas de classe = pas d'héritage, alors comment hierarchiser? - Maks - 26-03-2013

Tu dois remapper le constructor niahoo ^^
this.constructor = ...
Sinon instanceof est broken de mémoire

L'héritage en JS y'a plusieurs façon de le faire, c'est un long débat. Moi je prendrais la façon de faire de CS.


__extends = function(child, parent) {
for (var key in parent) {
if ({}.hasOwnProperty.call(parent, key)) {
child[key] = parent[key];
}
}
function ctor() { this.constructor = child; }
ctor.prototype = parent.prototype;
child.prototype = new ctor();
child.__super__ = parent.prototype;
return child;
};

__extends(Classe1, SuperClasse);

Au pire tu peux utiliser Typescript si tu veux que ça soit pas trop éloigner de JS.


RE: [JS]Pas de classe = pas d'héritage, alors comment hierarchiser? - niahoo - 26-03-2013

Erf je me rends compte que j'ai juste montré l'instanciacion et non pas l'héritage. Mais là j'ai la flemme.

Pour constructor perso je ne m'en sers pas puisque j'utilise mon second exemple comme base. (ou bien des objets Backbone qui pour le coup sont calqué sur des classes). Et puis instanceof ... je m'en suis jamais servi je crois bien, vu qu'il y a pas de système de types je fais sans dans tous les cas.

Mais sur mon premier exemple tu le rajouterais où ?


RE: [JS] Pas de classe = pas d'héritage, alors comment hierarchiser? - Sephi-Chan - 26-03-2013

Utilise CoffeeScript. Smile