Création d'objets

Le
bertrand
Bonjour,

Quelle est la meilleur façon de créer un objet :

function MyObjet()
{
this.myPropriete = 0;

this.MyMethode = function(arg)
{
alert(arg);
}
}

ou alors

function MyObjet()
{
this.myPropriete = 0;
}

MyObjet.prototype.MyMethode = function(arg)
{
this.myPropriete += arg;
alert(myPropriete);
}

Dans le deuxième cas, on ne peut ni avoir de méthode, ni de propriété
privés, tout est public.

Merci pour vos réponses,

Matt
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #20918761
bertrand a écrit :
Bonjour,

Quelle est la meilleur façon de créer un objet :

function MyObjet()
{
this.myPropriete = 0;

this.MyMethode = function(arg)
{
alert(arg);
}
}

ou alors

function MyObjet()
{
this.myPropriete = 0;
}

MyObjet.prototype.MyMethode = function(arg)
{
this.myPropriete += arg;
alert(myPropriete);
}

Dans le deuxième cas, on ne peut ni avoir de méthode, ni de propriété
privés, tout est public.



C'est la voie du Javascript : pas d'encapsulation.

La deuxième méthode est celle qui doit être utilisée. La raison est
simple : performance. De plus, avec la première méthode, tu risques
d'avoir des références cycliques, qui ne sont pas bien nettoyées par les
garbage collector des moteurs Javascript.

Personnellement, je définis mes objets comme suit :

var people = function()
{
if(arguments.length) this.name = arguments[0] ;
if(arguments.length == 2)
this.pets = arguments[1] ;
}
people.prototype.name = '' ;
people.prototype.pets = [] ;
people.prototype.display = function()
{
print('Name: ' + this.name) ;
print('Pets(' + this.pets.length + '):') ;
this.pets.map(print) ;
}

var someone = new people('Paul') ;
var me = new people('Mickael', ['Chouette', 'Salem']) ;
var her = new people('Sabrina', ['Zingaroo', 'Grochat']) ;

[someone, me, her].map(function(person) { person.display() }) ;

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
bertrand
Le #20919591
Mickaël Wolff a écrit :
bertrand a écrit :
Bonjour,

Quelle est la meilleur façon de créer un objet :

function MyObjet()
{
this.myPropriete = 0;

this.MyMethode = function(arg)
{
alert(arg);
}
}

ou alors

function MyObjet()
{
this.myPropriete = 0;
}

MyObjet.prototype.MyMethode = function(arg)
{
this.myPropriete += arg;
alert(myPropriete);
}

Dans le deuxième cas, on ne peut ni avoir de méthode, ni de propriété
privés, tout est public.



C'est la voie du Javascript : pas d'encapsulation.

La deuxième méthode est celle qui doit être utilisée. La raison est
simple : performance. De plus, avec la première méthode, tu risques
d'avoir des références cycliques, qui ne sont pas bien nettoyées par les
garbage collector des moteurs Javascript.

Personnellement, je définis mes objets comme suit :

var people = function()
{
if(arguments.length) this.name = arguments[0] ;
if(arguments.length == 2)
this.pets = arguments[1] ;
}
people.prototype.name = '' ;
people.prototype.pets = [] ;
people.prototype.display = function()
{
print('Name: ' + this.name) ;
print('Pets(' + this.pets.length + '):') ;
this.pets.map(print) ;
}

var someone = new people('Paul') ;
var me = new people('Mickael', ['Chouette', 'Salem']) ;
var her = new people('Sabrina', ['Zingaroo', 'Grochat']) ;

[someone, me, her].map(function(person) { person.display() }) ;




Merci pour ta réponse...
Par contre, je ne comprends pas ta dernière ligne ???

Sinon voici un exemple de requête HTTP :

function MyRequeteMulti()
{
}

MyRequeteMulti.prototype.XMLfile = "";
MyRequeteMulti.prototype.XMLData = null;

MyRequeteMulti.prototype.readXML = function(XMLfile)
{
this.XMLfile = XMLfile;

// Lecture du fichier xml
var xhr = new XMLHttpRequest();
xhr.overrideMimeType('text/xml');
xhr.open("GET", this.XMLfile, true);
xhr.onreadystatechange =
function(){alert("ok");this.readXML_callback(xhr);}
xhr.send(null);
}

MyRequeteMulti.prototype.readXML_callback = function(xhr)
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
this.XMLData = xhr.responseXML;
}
else
{
alert("Erreur");
}
}
}

Le problème c'est la fonction readXML_callback n'est jamais appelée par
contre je passe bien dans le onreadystatechange (ou j'ai mis un alert)

Merci encore,

Matt...
Pascal
Le #20919961
bertrand a écrit :
Le problème c'est la fonction readXML_callback n'est jamais appelée par
contre je passe bien dans le onreadystatechange (ou j'ai mis un alert)



Bonjour,

Le mieux serait de passer la fonction de "callback" en argument, et que
celle-ci soit totalement extérieure à l'objet "MyRequeteMulti".

Par exemple :

<code>

// passage de la fonction de retour en 2e argument
MyRequeteMulti.prototype.readXML = function(XMLfile, callback) {
/* (création de l'objet xhr) ... */
xhr.onreadystatechange = function() {
// la gestion complète de l'état est incorporée ici
if(xhr.readyState == 4) {
if(xhr.status == 200) {
// réussite => appel de la fn de retour avec la réponse en arg
callback(xhr.responseXML);
} else {
alert("Erreur");
}
}
}
xhr.send(null);
}

// définition externe de la fonction de retour
function xhrCallback(xhrResponse) {
/* (traitement de la réponse) ... */
}

// création de l'objet et passage du callback
var myRM = new MyRequeteMulti();
myRM.readXML("hostedFile", xhrCallback);

</code>

Cordialement,
Pascal
bertrand
Le #20920621
Pascal a écrit :

Le mieux serait de passer la fonction de "callback" en argument, et que
celle-ci soit totalement extérieure à l'objet "MyRequeteMulti".

Par exemple :

<code>

// passage de la fonction de retour en 2e argument
MyRequeteMulti.prototype.readXML = function(XMLfile, callback) {
/* (création de l'objet xhr) ... */
xhr.onreadystatechange = function() {
// la gestion complète de l'état est incorporée ici
if(xhr.readyState == 4) {
if(xhr.status == 200) {
// réussite => appel de la fn de retour avec la réponse en arg
callback(xhr.responseXML);
} else {
alert("Erreur");
}
}
}
xhr.send(null);
}

// définition externe de la fonction de retour
function xhrCallback(xhrResponse) {
/* (traitement de la réponse) ... */
}

// création de l'objet et passage du callback
var myRM = new MyRequeteMulti();
myRM.readXML("hostedFile", xhrCallback);

</code>

Cordialement,
Pascal




Bonsoir,

Ok, mais je veux que le traitement fasse partie intégrante de l'objet
donc voici ce que j'ai adopté :

xhr.onreadystatechange function()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
var XMLData = xhr.responseXML;
this.XMLParse(XMLData);
}
else
{
alert("Erreur");
}
}
}

Par ailleurs, pourquoi ma fonction n'était pas appelée ???

Merci,

Matt...
Pascal
Le #20920861
bertrand a écrit :
Ok, mais je veux que le traitement fasse partie intégrante de l'objet



C'est dommage, car de ce fait l'objet, qui traite principalement de la
création d'une requête type Ajax, n'est pas réutilisable pour d'aut res
traitements possibles de la réponse.

Par ailleurs, pourquoi ma fonction n'était pas appelée ???



Parce que le contexte de "this" n'était pas créé au moment de la
définition de la fonction appelée par l'évènement "onreadystatech ange".
Il devait certainement y avoir un message d'erreur, du genre : "this
n'est pas défini".

Pascal
bertrand
Le #20930381
bertrand a écrit :

Ok, mais je veux que le traitement fasse partie intégrante de l'objet
donc voici ce que j'ai adopté :

xhr.onreadystatechange > function()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
var XMLData = xhr.responseXML;
this.XMLParse(XMLData);
}
else
{
alert("Erreur");
}
}
}




Bonsoir,

Ce que j'ai écris ne marche pas plus (logique)...
Donc j'ai choisi de passer directement le xml et non plus d'aller le
chercher dans l'objet...


Merci encore pour ta réponse,

Matt...
bertrand
Le #20930851
Mickaël Wolff a écrit :

Personnellement, je définis mes objets comme suit :

var people = function()
{
if(arguments.length) this.name = arguments[0] ;
if(arguments.length == 2)
this.pets = arguments[1] ;
}
people.prototype.name = '' ;
people.prototype.pets = [] ;
people.prototype.display = function()
{
print('Name: ' + this.name) ;
print('Pets(' + this.pets.length + '):') ;
this.pets.map(print) ;
}

var someone = new people('Paul') ;
var me = new people('Mickael', ['Chouette', 'Salem']) ;
var her = new people('Sabrina', ['Zingaroo', 'Grochat']) ;

[someone, me, her].map(function(person) { person.display() }) ;




Bonsoir,

Je voudrais savoir si ma façon de faire est bien :

function MyRequeteMulti()
{
this.sStructure = function(nom)
{
this.nom = nom;
}

this.listeStructure = new Array();

this.createListeStructure = function()
{
for(i = 0; i < 3; i++)
this.listeStructure.push(new this.sStructure("toto_" + i));
}

this.readListeStructure = function()
{
for(i = 0; i < 3; i++)
alert(this.listeStructure[i].nom);
}
}

Ensuite, je modifierai mon objet pour le faire avec des prototypes...

Merci,

Matt...
bertrand
Le #20976481
bertrand a écrit :
Bonsoir,

Je voudrais savoir si ma façon de faire est bien :

function MyRequeteMulti()
{
this.sStructure = function(nom)
{
this.nom = nom;
}

this.listeStructure = new Array();

this.createListeStructure = function()
{
for(i = 0; i < 3; i++)
this.listeStructure.push(new this.sStructure("toto_" + i));
}

this.readListeStructure = function()
{
for(i = 0; i < 3; i++)
alert(this.listeStructure[i].nom);
}
}

Ensuite, je modifierai mon objet pour le faire avec des prototypes...

Merci,

Matt...



Bonjour,

Personne pour me répondre ??

Bonne journée,

Matt..
Pascal
Le #20980001
bertrand a écrit :
Je voudrais savoir si ma façon de faire est bien :



A quel point de vue, codification, fonctionnalités, autre ?

this.listeStructure.push(new this.sStructure("toto_" + i));



Je comprends pas trop le "new this.sStructure...", étant donné qu'il est
défini comme une méthode de "MyRequeteMulti".
Si c'est vraiment un nouvel objet qui doit être créé, je préfèr e le voir
défini en dehors, mais bon, il y a peut-être une raison que j'ignore.

Ensuite, je modifierai mon objet pour le faire avec des prototypes...



Autant le faire tout de suite, ça ne gâche rien, au contraire.

Cordialement,
Pascal
Mickaël Wolff
Le #20986391
bertrand a écrit :
bertrand a écrit :
Bonsoir,

Je voudrais savoir si ma façon de faire est bien :





C'est une manière de faire. Elle peut se justifier. Cependant, ici,
on ne comprend pas l'intérêt de toute cette complexité. Sans
commentaires, sans justification, on peut difficilement critiquer ton
design.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Publicité
Poster une réponse
Anonyme