OVH Cloud OVH Cloud

Ajouter une propriété à l'objet Array

10 réponses
Avatar
unbewusst.sein
je souhaite ajouter la propriété isEmpty à l'objet Array, je fais ça
comme ça :

Array.prototype.is_empty=function(){return (this.length === 0);};
Array.prototype.isEmpty=is_empty();

et FF2 me retourne une erreur :

is_empty is not defined ???

bien sûr j'aurais pu écrire :

Array.prototype.isEmpty=function(){return (this.length === 0);};

mais je souhaite que isEmpty soit une propriété plutôt qu'une méthode...

je ne pige pas où est le problème...
--
Une Bévue

10 réponses

Avatar
unbewusst.sein
Une Bévue wrote:

je ne pige pas où est le problème...


j'ai trouvé, c'est idiot, il aurait fallu écrire :

Array.prototype.isEmpty=Array.prototype.is_empty();

qui ne donne + d'erreur mais un résultat faux )))

car this.length du coup est ths à 0...
--
Une Bévue

Avatar
Olivier Miakinen

j'ai trouvé, c'est idiot, il aurait fallu écrire :

Array.prototype.isEmpty=Array.prototype.is_empty();

qui ne donne + d'erreur mais un résultat faux )))


Et :

Array.prototype.isEmpty = Array.prototype.is_empty;

?

Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:

Et :

Array.prototype.isEmpty = Array.prototype.is_empty;


bonne idée, manque de bol, du coup :

[].isEmpty me retourne la function is_empty()...

je crois bien avoir lu que ce n'est pas possible d'avoir length comme ça
ou alors en créant un nouvel Objet Array, mais bon, je n'y tiens pas...

tant pis, ça m'embête uniquement côté cosmétique car pour tous les
objets js j'ai ajouté les pptés (*):

Array.prototype.isArray=true;
[...]
Array.prototype.iObject=true;

[...]

Object.prototype.isArrayúlse;
[...]
Object.prototype.isObject=true;

c'est bizarre que ca n'ai pas été inclus dans le language que par typeof
avec lequel il faut lever des ambiguités...


* au lieu d'ajouter les pptés comme ça, je me demande si je ne peut pas
faire une boucle du genre :

var
jsObjects=['Array','Date','Boolean','Date','Function','Image','Number','
Object','String'];

for(var i=0;i<jsObjects.length;i++){
[jsObjects[i].prototype["is"+jsObjects[i]=<ce qui faut>;
}

dès que j'ai fini mon ménage ))))


j'essaie ça !
--
Une Bévue

Avatar
unbewusst.sein
Une Bévue wrote:

* au lieu d'ajouter les pptés comme ça, je me demande si je ne peut pas
faire une boucle du genre :

var
jsObjects=['Array','Date','Boolean','Date','Function','Image','Number','
Object','String'];

for(var i=0;i<jsObjects.length;i++){
[jsObjects[i].prototype["is"+jsObjects[i]=<ce qui faut>;
}


ce qui marche impec, il faut d'ailleurs dux boucles for imbriquées, c
tout )))
--
Une Bévue

Avatar
YD

Array.prototype.isArray=true;
[...]
Array.prototype.iObject=true;
[...]

c'est bizarre que ca n'ai pas été inclus dans le language que par typeof
avec lequel il faut lever des ambiguités...


Il y a aussi prototype.constructor
Par ex. :
Object.prototype.getType=function(){
t=/^function ([^( ]+)/.exec(this.constructor.toString());
return t?t[1]:null;
};

a=[1, 2, 3];
alert(a.getType());

"Limitation" de l'utilisation de constructor : quand on définit une instance
d'objet dont le constructeur est une fonction définie en JS, constructor renvoie
la fonction et non l'objet Object. C'est un comportement logique dans la mesure
où Object est l'ancêtre de tout objet JS, y compris Array, Number, etc.

HTH
--
Y.D.

Avatar
YD
je souhaite ajouter la propriété isEmpty à l'objet Array, je fais ça
comme ça :
mais je souhaite que isEmpty soit une propriété plutôt qu'une méthode...

je ne pige pas où est le problème...


De deux choses l'une :
- tu dois à toute modification sur l'objet mettre à jour cette propriété
- au moment de l'appel calculer son état

Tu peux utiliser la 1e possibilité si tu maîtrises complètement l'objet,
sur les objets natifs c'est exclu.
La deuxième suppose l'appel à une méthode interne pour répondre à la demande
de la propriété. C'est une possibilité qui existe dans le JS Netscape/Mozilla
depuis la version 1.5, les getter et setter. Ça semble correspondre à ce que
tu souhaites obtenir. Voir :

<http://developer.mozilla.org/fr/docs/Guide_JavaScript_1.5:Cr%C3%A9ation_d'objets:D%C3%A9finition_d'accesseurs_et_de_mutateurs>

--
Y.D.

Avatar
unbewusst.sein
YD wrote:

- au moment de l'appel calculer son état

Tu peux utiliser la 1e possibilité si tu maîtrises complètement l'objet,
sur les objets natifs c'est exclu. La deuxième suppose l'appel à une
méthode interne pour répondre à la demande de la propriété. C'est une
possibilité qui existe dans le JS Netscape/Mozilla depuis la version 1.5,
les getter et setter. Ça semble correspondre à ce que tu souhaites
obtenir. Voir :

<http://developer.mozilla.org/fr/docs/Guide_
JavaScript_1.5:Cr%C3%A9ation_d'objets:D%C3%A9finition_d'accesseurs_et_de_m
utateurs>

--
oui, oui, merci beaucoup, c'est ça, mais la page ci-dessus me dit "(Il

n'y a pour l'instant aucun texte sur cette page" ??

je ne veux pas maitriser complétement l'objet, cette propériété (et non
pas méthode : en java un getter est une méthode, à ma connaissance il
n'y a qu'en ruby où ppté et méthode sont "la même chose").

je souhaite donc attribuer cette propriété aux objets js suivants :

Array, Object et String.

je suppose que je trouverais ça sur le site moz en patois )))

--
Une Bévue

Avatar
unbewusst.sein
Une Bévue wrote:

oui, oui, merci beaucoup, c'est ça, mais la page ci-dessus me dit "(Il
n'y a pour l'instant aucun texte sur cette page" ??


finalement j'ai trouvé cette page en french...
--
Une Bévue

Avatar
unbewusst.sein
YD wrote:

La deuxième suppose l'appel à une méthode interne pour répondre à la demande
de la propriété. C'est une possibilité qui existe dans le JS Netscape/Mozilla
depuis la version 1.5, les getter et setter. Ça semble correspondre à ce que
tu souhaites obtenir.


bon, j'ai essayé ça :

Array.__defineGetter__("estVide",function(){return this.length;});

si je fais :

[0,1,2].estVide ça me donne undefined -- pas d'erreur

ou :

[0,1,2]estVide() ça me dit que la function estVide() n'existe pas...


dans la page filée en référence sur accesseurs et mutateurs il est
question de méthode (comme en java les getters et setters) et non de
propriété...

mais le message d'erreur dans le cas estVide() et le undefined dans le
cas estVide (qui ne renvoie pas la fonction) semblent vouloir dire que
c'est bien une propriété (ou attribut) et non une méthode...
--
Une Bévue

Avatar
unbewusst.sein
Une Bévue wrote:


Array.__defineGetter__("estVide",function(){return this.length;});


il y a sans doute une erreur dans la page mozilla, mais ne précise pas
si instance on objet.

ce qui marche impec comme je le souhaitais :

Array.prototype.__defineGetter(<même chose>);

est là j'ai bien une ppté et non pas une méthode donc dans la page en
français il y a deux erreurs :

les getters et setters ainsi défins ne sont pas des méthodes mais des
pptés, comme d'ailleurs le nom d'accesseur et mutateur l'indique, sinon
il n'y aurait pas d'intérêt )))

l'autre erreur étant que dans la syntaxe ci-dessus il faut utiliser :

Object.prototype.__blahblah

ensuite je trouve qu'ils ont mal choisi les noms :

__defineGetter__ et __defineSetter__

car n'étant pas des méthodes ce sont des accesseurs/mutateurs ils
auraient du choisir, amha :

__defineAccessor__ et __defineMutator__

qui prête moins à confusion...


bon en tk merci beaucoup ça roule et c'est ce qu'il me fallait très
exaactement !
--
Une Bévue