Salut Eric,
pour répondre a ta derniere question et en reprenant ton exemple, je vais écrire ta fonction nommé "uneFonction"
function uneFonction(paramA)
{
var premiereValeur = paramA.unParametre // correspond a 'bla'
var secondeValeur = paramA.unAutre // correspond a 'blablabla'
}
il est d'usage de considérer qu'en JS tout est objet, que ce soit une chaine de caractere, un nombre, une fonction, un tableau...
______________________________________
pour revenir au sujet concernant les classes, j'ai eu un exemple , dans un tres bon livre sur le webgl, de structure de code pour la "creation de classe" en JS par l'utilisation de closure, depuis je structure mon code comme suit :
exemple d'une classe "animal" et de deux classe "cat" et "dog" qui "herite" de la classe animal
var animal = (function(){
// count ==> variable static lié a la classe animal, incrementé lorsque l'on crée un objet animal
var count = 0;
return {
create: function(spec)
{
// that ==> objet relatif au nouvel objet crée correspond au "this"
var that = {};
var type = spec ? spec : "animal";
var crying = "not defined";
// incrementation du compteur lié a la classe
count++;
that.get_type = function()
{
return type;
}
that.get_count = function()
{
return count;
}
that.set_cry = function(a_cry)
{
crying = a_cry;
}
that.cry = function()
{
return crying;
}
//retourne le nouvel objet
return that;
}
}
})()
var cat = (function(){
return {
create: function()
{
// instanciation de la classe animal avec en parametre son type "a cat"
var that = animal.create("a cat")
that.set_cry("miawo");
return that;
}
}
})()
var dog = (function(){
return {
create: function()
{
// instanciation de la classe animal avec en parametre son type "a dog"
var that = animal.create("a dog");
that.set_cry("wouf");
that.get_eye_color = function()
{
return "black";
}
return that;
}
}
})()
var a_cat = cat.create()
console.log("appel methode cry de la classe animal herite par la classe cat: ", a_cat.cry())
console.log("appel methode get_count de la classe animal herité par la classe cat: ", a_cat.get_count())
console.log("appel methode get_type de la classe animal herité par la classe cat : ", a_cat.get_type())
var second_cat = cat.create()
console.log("appel methode get_count de la classe animal herité par la classe cat: ", second_cat.get_count())
var a_dog = dog.create()
console.log("appel methode cry la classe animal herite par la classe dog: ", a_dog.cry())
console.log("appel method get_count de la classe animal, doit etre egale a 3 (3 animaux instanciés) : ", a_dog.get_count())
console.log("appel methode get_type de la classe animal herité par la classe dog : ", a_dog.get_type())
console.log("appel methode get_eye_color de la classe dog: ", a_dog.get_eye_color())
Dernière modification par touky (2016-06-15 13:30:31)
Hors ligne
Ah ca me plait beaucoup cette approche syntaxique. Mais paradoxalement, quelque chose me gêne dans la manière. Je m'explique :
Dans ton exemple touky, tu recrées des fonctions create dans l'ensemble de tes objets. Cette fonction retourne un ensemble de fonction et de variable propre à l'objet. C'est un héritage.
Mais l'utilisation de create est ambigu puisque c'est une fonction reservé en Javascript http://www.ecma-international.org/ecma- … c-15.2.3.5
D'ailleurs si tu change create par creation (par ex) dans ton exemple, cela fonctionne aussi.
Mais cela fait une bonne piste de reflexion (source d'inspiration : http://stackoverflow.com/questions/2709 … ead-of-new) :
citation :
Mamifere = (function(){
var _this=this, zone_evolution="terrestre", multiplicateur = 1;
this.nom;
this.nb_pattes=0;
this.zone_evolution = function(){
if ( typeof(arguments[0]) != "undefined" ){
zone_evolution = arguments[0];
}else{
return zone_evolution;
};
};
this.est_bipede = function(){
if ( this.nb_pattes == 2 ){
return true;
};
return false;
};
this.son_nom = function(){
if ( typeof(arguments[0]) != "undefined" ){
this.nom = arguments[0];
}else{
return this.nom;
};
}
this.deplacement = function(){
if ( zone_evolution == "terrestre" ){
return "marche";
}
return "Non Définit";
};
return this;
})();
var animal1 = Object.create(Mamifere, {"nom" : {value: "Homme_1"}, "nb_pattes" : {value : 2}});
console.log(animal1.son_nom());
console.log((animal1.est_bipede()) ? "Bipede" : "Non Bipede");
console.log(animal1.zone_evolution());
var Baleine = Object.create(Mamifere, {
"nom" : {
value: "Homme_1"
},
"nb_pattes" : {
value : 0
},
"deplacement" : {
value : function(){
if ( this.zone_evolution() == "aquatique"){
return "Nage";
}else{
return "undefined";
}
}
}
});
var moby_dick = Object.create(Baleine, {"nom" : {value : "moby_dick"}, nb_pattes : {value : 0}});
console.log(moby_dick.son_nom());
console.log((moby_dick.est_bipede()) ? "Bipede" : "Non Bipede");
moby_dick.zone_evolution("aquatique");
console.log(moby_dick.zone_evolution());
console.log(moby_dick.deplacement());
Cette discussion ne fait que renforcer l'idée énoncée par EricRG :
citation :
je pense qu'il y a plusieurs "bonnes façons" de s'y prendre !
La question restant de savoir quelle est la meilleur ???
J'ai l'impression que l'approche syntaxique objet "strict" est intéressante, et la forme doit finir par influencer le fond.
Hors ligne
tepaze tu as raison,
je l'ai nommé "create" et ca peut etre ambigue et en fin de compte tu pourrait mettre un autre mot , tel que 'instance' par exemple ca fonctionne tout aussi bien, c'est toi qui definit la clé tel que tu le souhaite, de mon coté j'ai pris cette habitude, je ne me sert jamais de la methode create associe a Object ( Object.create() ).
Bref tu nomme cette clé comme tu veux du moment que c est explicite pour tout le monde.
Maintenant a me rememorer du coté performance pour le JS, eviter le mot clé "this" et "new"
Puis pour le "use strict" il me semble que c'est une manière de controler la syntaxe dans le code qui suit le mot cle, infiné c'est + stricte avec..
La meilleure methode reste celle qui te convient a toi pour te relire et travaille en equipe selon une norme et a voir les performances egalement
Dernière modification par touky (2016-06-15 23:08:01)
Hors ligne
Bonjour,
- "use strict" : J'en ai entendu parler dans la vidéo : Comprende enfin Javascript (https://www.youtube.com/watch?v=PSeU1IJztkI)
C'est à utiliser systématiquement afin d'avoir les messages d'erreurs que l'on s'attend à avoir dans la console web du navigateur... sinon, c'est du grand n'importe quoi (je résume )
- Passage de paramètre via un seul objet :
Merci merci ! Oui, comment n'y ai-je pas pensé tout seul, c'est évident
- Autre façons de faire de l'héritage :
wao : oui, je comprends qu'en Javascript, étant donné que l'on peut passer en paramètre un objet entier cela permet de s'y prendre d'une tout autre dfaçon qu'avec les langages à classes/Instances.
Sinon, pour ma part, je vais essayer de me débrouiller avec la méthode avec les prototypes et les new et les this (vous parlez d'un ralentissement au niveau des performances : j'espère que ce n'est pas trop grave !)
En fait, je souhaite pouvoir faire des traductions de tout ou partie de programmes en Processing-Java et Processing-p5js à tout moment, donc j'ai besoin de pouvoir m'y prendre de la même manière au niveau des concepts
Ma première tâche est d'écrire une "petite bibliothèque" pour faire une GUI toute simple pour réécrire mes 3 anciens jeux vidéo en version javascript. Je vais la réécrire en parrallèle aussi pour Processing (j'aimerais les faire tourner sur android).
Une fois cela fait , j'aurai une base pour créer d'autres applis.
P.S. Je suis vraiment très content que ce fil de discussion intéresse d'autres personnes car je ne connais personne que ça intéresse vers chez moi !
Hors ligne
et y'en a aussi qui regardent juste mais qui ont très interessés
Hors ligne
Pour information :
J'ai mis ce sujet "en attente" pour l'instant car je suis en train de me concentrer sur l'étude des chartes graphiques pour des sites internet (je regarde Foundation pour l'instant) et des CMS modx et silverstripe.
... mais je vais y revenir dès que je le pourrai !
Hors ligne
J'en reviens au début du fil !
Maintenant, il est possible d'écrire des classes avec le code ecmascript 6 (2015) , c'est à dire d'utiliser le mot clef class ...
et pour que ça fonctionne sur tous les navigateurs, le code ecmascript 6 peut être compilé en code ecmascript 5 facielement avec Babel :
https://babeljs.io/repl/#?babili=false& … ;code_lz=Q
Dernière modification par EricRG (2017-08-20 10:44:30)
Hors ligne