Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/06/2011, 11h04   #1
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
Par défaut chargement d'objets en langage de prototype

Bonjour,

J'ai un problème pour charger un objet en javascript. Ma démarche n'est probablement pas du tout la bonne à cause de mes réflexes de langages de classes.

J'ai une "classe" Document :

Code :
1
2
Document = function() {... attributs ...}
Document.prototype = {... methodes ...}
voici les méthodes que j'utilise pour les sauvegarde/chargement :

Code :
1
2
setCurrentDocument = function(document) {localStorage.setItem("currentDocument",JSON.stringify(document));}
getCurrentDocument = function() {return JSON.parse(localStorage.getItem("currentDocument")));}
mais l'objet ainsi sauvegardé/chargé perd les méthodes propres à sa "classe" Document (celles déclarées dans Document.prototype).
Du coup, est-ce qu'il faut déclarer les méthodes autrement, de façon à ce qu'il les conserve? Ou bien est-ce que je dois écrire
Code :
getCurrentDocument = function() {return new Document(JSON.parse(...));}
Dans ce cas, j'en viens à une deuxième question qui va vous paraitre stupide :
j'ai besoin de déclarer deux constructeurs :
Document = function() {...},
et aussi Document = function(doc) {...} afin de charger mon document comme décrit précédemment.
Mon problème, c'est comment faire ça en javscript ?

Encore une fois, je suis conscient que ma logique n'est pas la bonne. N'hésitez pas à m'ouvrir l'esprit
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h26   #2
 
Avatar de sylvain230
 
Homme Sylvain
Poitiers
Inscription : mai 2008
Messages : 229
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Poitiers
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : mai 2008
Messages : 229
Points : -3
Points : -3
Bonjour,

Pourquoi n'essaies tu pas de charger tes objets avec jQuery ?
C'est plus simple il me semble.

Exemple d'un code à moi :

Code :
1
2
3
4
5
6
7
8
9
10
 
WebGLBuffer.prototype.bufferTeapot = function() {
 
 
$.getJSON("Objets/Teapot.json",function(teapotData)
    {
...
     });
 
}
Voila
sylvain230 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h33   #3
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
Merci, mais $.getJSON demande une url sauf erreur. Alors pour accéder au localStorage du navigateur, je sais pas trop quoi mettre...

Mais peut-être que JQuery peut effectivement apporter une réponse plus simple à ma question.
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h36   #4
 
Avatar de sylvain230
 
Homme Sylvain
Poitiers
Inscription : mai 2008
Messages : 229
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Poitiers
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : mai 2008
Messages : 229
Points : -3
Points : -3
Sinon tu peux toujours créer un serveur en local et cela marchera normalement.
sylvain230 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h42   #5
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
oO ?!
Tu veux que je crée un server local côté client en javascript juste pour pouvoir utiliser .$getJSON au lieu de JSON.parse(localStorage.getItem(...)) ?
C'est pas un peu tordu comme solution ?

Ou alors j'ai pas du tout compris ce que tu voulais dire par "créer un serveur en local"
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h44   #6
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 803
Points : 35 803
Citation:
Envoyé par sylvain230
Pourquoi n'essaies tu pas de charger tes objets avec jQuery ?
Parce que jQuery n'est pas du tout adapté à cette situation
Et utiliser jQuery (ou tout autre framework) comme rustine aux lacunes que l'on a en JavaScript est rarement la bonne utilisation

@Sharcoux : il faudrait que tu nous montres plus de code : comment sont créées tes méthodes et tes propriétés et comment tu les appelles. Ceci dit, appeler un paramètre document est suicidaire, comment veux-tu que JavaScript distingue ton paramètre de l'objet window.document (puisque window est implicite) ?
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h45   #7
 
Avatar de sylvain230
 
Homme Sylvain
Poitiers
Inscription : mai 2008
Messages : 229
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Poitiers
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : mai 2008
Messages : 229
Points : -3
Points : -3
Ben oui c'est un peu tordu comme solution j'avoue lol mais cela fonctionne normalement.
Avec FF sur mais avec Chrome je sais plus :s
sylvain230 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h50   #8
 
Avatar de sylvain230
 
Homme Sylvain
Poitiers
Inscription : mai 2008
Messages : 229
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Poitiers
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : mai 2008
Messages : 229
Points : -3
Points : -3
Citation:
Et utiliser jQuery (ou tout autre framework) comme rustine aux lacunes que l'on a en JavaScript est rarement la bonne utilisation
Oui peut être mais dans certains cas, c'est mieux que de réinventer la roue non ?
sylvain230 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h04   #9
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
Citation:
Envoyé par Bovino Voir le message
appeler un paramètre document est suicidaire, comment veux-tu que JavaScript distingue ton paramètre de l'objet window.document (puisque window est implicite) ?
euh... chépa ^^ En tout cas pour le moment il y arrive
Bon d'accord, en fait il s'appelait doc, et j'ai dû le renommer à cause de conventions de nommage. Mais maintenant que tu le dis, document était peut-être pas l'idée la plus géniale que je puisse trouver pour le nouveau nom

Bon, par contre, pour mon problème, voilà la classe document :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* JSON document */
var JSONDocument = function() {
    this.type = "text";
    this.author=getCurrentUser().getName();
    this.title="Untitled";
    this.content="";
    this.creation=currentTime();
    this.lastModification=currentTime();
    this.state=Document.states.draft;
 
    this.setAsCurrentDocument();//temp
}
JSONDocument.prototype = {
    //type
    getType: function() {return this.type;},
 
    //content
    getContent:function() {return this.content;},
    setContent:function(content) {this.content=content;},
 
    //title
    getTitle:function() {return this.title;},
    setTitle:function(title) {this.title=title;},
 
    //author
    getAuthor:function() {return this.author;},
    setAuthor:function(userName) {this.author=userName;},
 
    //dates
    getCreation:function() {return this.creation;},
    getLastModification:function() {return this.lastModification;},
    setLastModification:function(date) {this.lastModification=date;},
 
    //state
    getState:function() {return this.state;},
    setState:function(state) {this.state=state;},
Je suis sûr qu'il y a un moyen pour "raccrocher" le prototype de JSONDocument à l'objet que je charge depuis le storage, mais je sais pas comment faire
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h49   #10
Membre régulier
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 87
Points : 87
Attention a la manière dont tu prototype tes objets. Normalement la propriété prototype permet d’ajouter des méthodes ou attributs aux instances déjà créer de l’objet.

par exemple :
Code :
1
2
3
4
5
6
7
var JSONDocument = function() { this.title = "Document A" }
 
var doc = new JSONDocument(); 
 
JSONDocument.prototype.DisplayTitle = function() { alert(this.title); };
 
doc.DisplayTitle();
or ceci, chez moi sous Firefox, ne marche pas :
Code :
1
2
3
4
5
6
7
8
9
10
var JSONDocument = function() { this.title = "Document A" }
 
var doc = new JSONDocument(); 
 
JSONDocument.prototype = 
{
	DisplayTitle : function() { alert(this.title); }
}
 
doc.DisplayTitle(); // erreur DisplayTitle == undefined
Pour tes problèmes initiaux je te répondrais plus tard la c’est la pause dej !
p3ga5e est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 15/06/2011, 13h11   #11
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
Hum... Je suis pas convaincu :

Code :
1
2
3
4
5
6
7
8
var Document = function() { this.title = "Document A";}
Document.prototype =
{
	DisplayTitle : function() { alert(this.title); }
}
 
var doc = new Document();
doc.DisplayTitle();
marche très bien chez moi.
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 15/06/2011, 13h28   #12
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 803
Points : 35 803
Citation:
Envoyé par p3ga5e
Attention a la manière dont tu prototype tes objets. Normalement la propriété prototype permet d’ajouter des méthodes ou attributs aux instances déjà créer de l’objet.
Heu... non pas vraiment. J'aurais même tendance à dire au contraire, il est préférable de déclarer complètement l'objet (donc en incluant les ajouts au prototype) avant d'instancier un objet, même de toute façon, l'ajout au prototype impacte toutes les instances, qu'elles existent déjà ou non.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 13h36   #13
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
.. et pour ma question initiale ?
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 13h39   #14
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 803
Points : 35 803
La seule chose que je vois, c'est dans le constructeur, si par exemple dans
Code :
this.lastModification=currentTime();
currentTime() est dans le prototype, alors il faut appeler
Code :
this.lastModification=this.currentTime();
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 13h57   #15
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
currentTime est une fonction globale. Elle n'est pas dans prototype.
Bon, je récapitule les pistes que j'ai proposé :

- ajouter à Document un deuxième constructeur. On aurait :
Document = function() {..}
et Document = function(objet_JSON) {...}
Mais je ne sais pas faire

- ajouter le prototype de Document aux méthodes de mon objet JSON. Un truc du type
Code :
1
2
doc = getCurrentDocument() // charge depuis le localStorage
doc.prototype = Document.prototype
ou quelque chose comme ça. (je précise que, tel quel, ça marche pas)

- utiliser autre chose que prototype pour déclarer les méthodes de Document

Si vous voyez un bout de solution pour l'une de ces pistes, votre intervention est la bienvenue.

Merci
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 14h32   #16
Membre habitué
 
Homme
Étudiant
Inscription : mai 2011
Messages : 226
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 226
Points : 126
Points : 126
Bon, j'ai fini par trouver :

Code :
1
2
3
4
5
6
7
8
9
var Document = function() { this.title = "Document A";}
Document.prototype =
{
	DisplayTitle : function() { alert(this.title); }
}
 
var doc = {title: "Document B"};
doc.__proto__ = Document.prototype;
doc.DisplayTitle();
doc représente l'objet tel qu'il a été chargé par la méthode getDocument...().
doc.DisplayTitle() affiche bien "Document B"
Sharcoux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 15h19   #17
Membre régulier
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 87
Points : 87
Voila comment moi, je procéderais !

Touts d’abord je prototype les objets pour y ajouter une méthode Merge, comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
/***
 * Copies all the properties of the obj if they don't already exist or crush it.
 */    
Object.prototype.Merge = function(obj,crush)
{ 
    for(var p in obj)
	{
	    if(crush || this[p]===undefined)
		    this[p] = obj[p];
	}
	return this;
};
Cela me permet d’écrire ce genre de chose :
Code :
1
2
3
4
var sum = { A : 3 }.Merge({ A: 5, B : 5 } );
alert(sum.A + sum.B); // == 8
sum = { A : 3 }.Merge( { A: 5, B : 5 }, true );
alert(sum.A + sum.B); // ==  10
Ensuite pour revenir sur l’exemple Document :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var Document = function ()
{
    if(arguments.length==0)
    {
        // Default Attributs
        this.Merge({ Title : "New Document" });
    }
    else
        this.Merge(arguments[0])
    //Add Methods
    this.Merge
    ({
        SetTitle : function(title) { this.Title = title; } 
    });
};
// constructeur par default
var doc = new Document();
alert(doc.Title); // "New Document"
doc.SetTitle("Document A");
alert(doc.Title); //"Document A"
 
//constructeur par copie
doc = new Document( { Title : "Document B" });
alert(doc.Title);// "Document B"
Comme tu le voit les fonctions en Javascript n’ont pas de signature, si tu déclare 2 fonctions avec le même nom mais avec un nombre d’arguments différent, la 2eme fonction evalué écrasera la 1ere.

En javascript il n’est pas obligatoire de déclarer les arguments, l’accès aux arguments passé a la fonction est disponible par le tableau arguments
p3ga5e est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 15h58   #18
Membre régulier
 
Inscription : octobre 2010
Messages : 65
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 65
Points : 87
Points : 87
Citation:
Envoyé par Bovino Voir le message
Heu... non pas vraiment. J'aurais même tendance à dire au contraire, il est préférable de déclarer complètement l'objet (donc en incluant les ajouts au prototype) avant d'instancier un objet, même de toute façon, l'ajout au prototype impacte toutes les instances, qu'elles existent déjà ou non.
Je suis d’accord avec toi, mon exemple été juste pour pointer du doigt l’erreur syntaxique.
Personnellement je me sert du prototypage uniquement sur les objets dont je n’ai pas la possibilité de modifier leur déclarations par example les type de base ( Function, Object, Array) ou un élément du DOM .je m’en passe totalement lors de la déclaration de mes objets.
p3ga5e est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h07.


 
 
 
 
Partenaires

Hébergement Web