begin process at 2012 05 29 02:12:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Javascript / DHTML / Ajax

 > 

CSS

 > 

Général

 > 

Les classes en JS


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Les classes en JS

lundi 19 octobre 2009 à 21:48:46 | Les classes en JS

alexflex25

Bonjour,

Voilà, j'ai enfin réussi à faire ma première classe en javascript!
Mais il y a un "hic" (évidement...)

Je m'explique, lorsque que je fais une instance de ma classe il n'y a pas de problème. Mais impossible de créer plusieurs instances de cette classe?

En cherchant sur internet j'ai vite compris que mon objet était copié par référence et non par valeur... J'ai également trouvé divers solutions pour résoudre le problème mais j'aimerais savoir si quelqu'un à de l'expérience dans le domaine pour m'aider à trouver la meilleur solution.

Pour information j'ai utilisé la librairie "prototype" pour créer ma classe croyant (bêtement) que le problème ne se poserait pas.

Merci d'avance
mardi 20 octobre 2009 à 05:42:00 | Re : Les classes en JS

Arto_8000

Il faut regarder d'avantage au niveau du clonage d'objet. Ce qui a l'air d'être la méthode la plus simple pour faire cela en javascript est ceci :

Code Javascript :
function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;
    var temp = new obj.constructor(); 
    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}


Sources :
http://dev.petitchevalroux.net/javascript/cloner-objet-avec-fonction-clone-javascript.115.html
http://keithdevens.com/weblog/archive/2007/Jun/07/javascript.clone

mardi 20 octobre 2009 à 18:35:22 | Re : Les classes en JS

alexflex25

Bonsoir,

Très bonne idée, mais mon objet semble trop gros puisque le javascript me retourne
"too much recursion"

L'idée reste tout de même très bonne.

Peut-être une autre piste?

Merci beaucoup

mardi 20 octobre 2009 à 18:53:15 | Re : Les classes en JS

alexflex25

Re bonsoir,

Apres le "profilage" (cf: firebug) la fonction "clone" que tu m'as fournis est appelé 485552 fois pour cloner mon objet.

Pourtant je n'ai que 30 attributs et 21 méthodes...
mercredi 21 octobre 2009 à 17:36:09 | Re : Les classes en JS

Arto_8000

La problème que tu as dans ton cas, c'est que tu as probablement des objets qui sont placés sur le prototype de la classe Object.

Ceci créera un objet avec une profondeur infini :

Code Javascript :
Object.prototype.obj = {valeur : "obj"};
{test : "1"}.obj.obj.obj.obj.obj.obj.valeur == "obj"


Il y a deux façons de résoudre le problème, soit que tu limites la profondeur de la copie ou que tu ne copie pas ce qui est hérité de Object.

Solution 1 (profondeur maximal):

Code Javascript :
function clone(obj, maxDepth) {
	if(obj == null || typeof(obj) != 'object')
        return obj;
    var temp = new obj.constructor(); 
    for(var key in obj) {
        if (maxDepth > 1)
	    temp[key] = clone(obj[key], maxDepth - 1);
        else
	    temp[key] = obj[key];
    }
    return temp;
}


Solution 2 (omission du prototype de la classe Object) :

Code Javascript :
function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;
    var objPrototype = Object.prototype;
    var temp = new obj.constructor(); 
    for(var key in obj) {
	if (!objPrototype[key])
	    temp[key] = clone(obj[key]);
    }
    return temp;
}
mercredi 21 octobre 2009 à 18:48:41 | Re : Les classes en JS

alexflex25

Bonsoir et merci,

J'ai testé aujourd'hui les deux fonctions:
L'utilisation de la fonction numéro deux me retourne:

uncaught exception: [Exception... "Cannot convert WrappedNative to function" nsresult: "0x8057000d (NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN)" location: "JS frame :: (site web) :: clone :: line 68" data: no]

Je ne vous cache pas que ce message dépasse de très loin mes (maigres) compétences en javascript...


Pour ce qui est de la 1ere fonction je vois très bien ou est l'astuce, mais comment définir la profondeur de son objet?
J'imagine que chaque attribut correspond au premier niveau, mais les méthodes...

Bref je pense avoir beaucoup trop de lacune pour comprendre réellement ces fonctions.

Je vais faire des recherches pour mieux comprendre, dans tous les cas merci pour tes explications
mercredi 21 octobre 2009 à 21:02:14 | Re : Les classes en JS

alexflex25

Re bonsoir,

J'ai trouvé une solution (certes nul), mais qui m'a montré un autre problème stupide...
Je ne sais pas si j'ose vous parler de ma solution mais je me lance quand même... (tant pis pour les moqueries)

J'ai fais une "class" que j'ai nommé "Maclasse" que j'ai dupliqué pour faire "MaclasseA" et "MaclasseB" qui sont strictement identique...
J'ai donc deux fichiers identiques "MaclasseA" et "MaclasseB" où j'ai simplement changé le nom de la class

quand je fais:
var a = new MaclasseA();
var b = new MaclasseB();

Pas de problème a et b sont bien deux objets identiques et indépendant (ouf...)

Mais le problème, c'est que dans "Maclasse" je défini des actions sur les attributs sur l'événement "document.onclick".
Donc forcement mes actions sont toujours écrasés par la dernière instance de "Maclasse" que se soit "MaclasseA" ou "MaclasseB"

En résumé... je pense... que je l'ai dans le ..........(coude évidemment)

Peut être y a t'il une solution?

Merci beaucoup
mercredi 21 octobre 2009 à 21:40:57 | Re : Les classes en JS

Arto_8000

Pour ce qui est de la profondeur, tu peux voir ça comme le nombre de «.» que tu mets pour atteindre ce que tu veux.

Ainsi,

var obj = new Object();
obj.value // profondeur 1
obj.objDansOjb.valeur // profondeur 2

Pour l'autre méthode essaie avec ceci, j'ai testé de mon côté la version original et il n'y avait pas de bogue, mais j'ai une petite idée de ce qui a pu causer le problème.

Code Javascript :
function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;
    var objPrototype = Object.prototype;
    var temp = new obj.constructor(); 
    for(var key in obj) {
	if (typeof objPrototype[key] == "undefined")
	    temp[key] = clone(obj[key]);
    }
    return temp;
}


Cette discussion est classée dans : problème, créer, classe, classes, js


Répondre à ce message

Sujets en rapport avec ce message

Problème JS: Gérer une listbox et traiter les valeur avec PHP... [ par Rabba ] J'ai une page dont le but est de pouvoir insérer des mots-clefs dans une listbox avec du javascript et ensuite, lors de la validation du formulaire, d JavaScript: appel du fichier externet (.js) - Help!! [ par Henri9009 ] Bonjour à tous. Je ne comprends pas comment je peux avoir un problème avec une manipulation si simple. Je vais devenir fou!!! Ça fait un ¿du php dans mon js? [ par emiilie ] bonjour a tous!voila: j'ai une belle classe js qui marche tres bien mais dans laquelle je voudrais recupérer des variables générer pas des fonctions d Problème création .js regroupant liens d'un menu [ par shadow125 ] Salut à tous et à toutes !Voila mon problème est le suivant :J'aimerai faire un .js d'appel pour des liens d'un menu qui changerai tout les 30 jours, Gadget et webService [ par white_mage ] Je ne sais pas si c'est moi qui ne comprends rien au webService appelé depuis JS ou si tout le monde est confronté au même genre de problème que moi. Problème avec un fichier .js [ par mwa_85 ] Je commence la création de site web depuis avril et je remet à jour un site mais depuis hier j'ai un problèmeLe menu dynamique qui se trouve à gauche Problème de calcul [ par leoloucal ] Bonjour, Tout d'abord, je ne sais pas si je suis sur le bon forum si ce n'est pas le cas désolée. Je crée normalement mes sites sur flash et là, je s barre de chargement php/js [ par fartounet ] Bonsoir tout le monde ! Je vous explique mon problème : j'ai créé une barre de progression en php par rapport à un compteur fixé a une date précise. CRéation d'objet [ par jeanjeandada ] Bonjour,POur créer un objet avec ces propriété il faut créer une classe ??? si oui, comment faites vous pour en créer une . merci<span style="color: [JS] Débutant : Problème avec une classe et fonction.. [ par ludoviskm ] Bonjour à tous.Je suis en train de developper une classe "Calendar" a partir de truc trouvé à droite et a gauche sur le net.L'objet est instancié de l


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales