soit un constructeur (simplifié) de Hash :
function Hash(){
var _hash=new Array(),_keys=new Array(),_length=0;
this.length=function(){return _length;};
this.add=function(k,v){if(typeof(_hash[k])==='undefined'){_keys.push(k);
_length++;}_hash[k]=v;};
this.valueOf=function(k){return _hash[k];};
this.keyAt=function(i){return _keys[i];};
}
deux "classes" en hérite :
function Properties(){}
Properties.prototype=new Hash();
Properties.prototype.cssText=function(){
var s = '';
for(var i=0;i<this.length();i++){s+=this.keyAt(i)+':
'+this.valueOf(this.keyAt(i))+';';}
return s;
};
function Selectors(){}
Selectors.prototype=new Hash();
Selectors.prototype.rule=function(selector){return selector+
'
{'+this.valueOf(selector).cssText()+'}';};
Selectors.prototype.rules=function(){
var s = '',tab=' ';
for(var i=0;i<this.length();i++){s+=this.keyAt(i)+
'
{\n'+tab+this.valueOf(this.keyAt(i)).cssText()+'\n}\n';}
return s;
}
je teste :
var props1=new Properties();
props1.add('background-color','#eee');
props1.add('color','#333');
props1.cssText() // donne : background-color: #eee;color: #333; // OK
var props2=new Properties();
props2.add('background-color','#6aca6a');
props2.add('color','#f60');
props2.cssText() // donne : background-color: #6aca6a;color: #f60; // OK
maintenant, j'ajoute ces propriétés à leur sélecteur par :
var sels=new Selectors();
sels.add('div#menu dl dt',props1);
sels.add('div#menu dl dt:hover',props2);
c'est là que les ennuis commencent :
sels.rule('div#menu dl dt')// donne :
sels.rule('div#menu dl dt'): div#menu dl dt {background-color:
#6aca6a;color: #f60;}// FAUX
sels.rule('div#menu dl dt:hover')// donne :
div#menu dl dt:hover {background-color: #6aca6a;color: #f60;}// OK PAR
CHANCE
de même :
sels.rules()// me donne :
div#menu dl dt {
background-color: #6aca6a;color: #f60;
}
div#menu dl dt:hover {
background-color: #6aca6a;color: #f60;
}
les propriétés du sélecteur 'div#menu dl dt:hover' sont attribuées au
sélecteur 'div#menu dl dt'
tout se passe "comme si" props2 avait écrasé props1...
De quoi parles-tu exactement ? À ma connaissance JavaScript n'a pas de méthode toJSONString. Peut-être s'agit-il d'un fonctianalité offerte par une bibliothèque que tu utilises?
oui, ça permet de "sérialiser" les Objects, Arrays etc.. de JS en string d'où le nom toJSString()
je m'en set pour déposer dans un cookie un objet couleur. -- Une Bévue
Alex Marandon <invalid@nowhere.invalid.org> wrote:
De quoi parles-tu exactement ? À ma connaissance JavaScript n'a pas de
méthode toJSONString. Peut-être s'agit-il d'un fonctianalité offerte par
une bibliothèque que tu utilises?
oui, ça permet de "sérialiser" les Objects, Arrays etc.. de JS en string
d'où le nom toJSString()
je m'en set pour déposer dans un cookie un objet couleur.
--
Une Bévue
De quoi parles-tu exactement ? À ma connaissance JavaScript n'a pas de méthode toJSONString. Peut-être s'agit-il d'un fonctianalité offerte par une bibliothèque que tu utilises?
oui, ça permet de "sérialiser" les Objects, Arrays etc.. de JS en string d'où le nom toJSString()
je m'en set pour déposer dans un cookie un objet couleur. -- Une Bévue
Bruno Desthuilliers
BertrandB wrote:
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
En quoi cela contredit-il le fait que ce soient des tableaux associatifs?
Tu peux développer ? j'ai toujours pensé que les objets étaient
implémentés comme un tableau associatif dans javascript (de même que les espaces de noms)
par exemple, json ajoute une méthode "toJSONString()" à tous les objets JS.
pour balayer les propriétés d'un objet JS généralement on fait : for(var propriete in objet){...}
c'est là où il faut filtrer car propriete pourra prendre la valeur toJSSONString qui est égale à : function(){< le corps de cette fonction...>};
donc, pour n'avoir QUE les propriétés de l'objet
Mais cette fonction *est* une propriété de l'objet. En Javascript, les fonctions aussi sont des objets, et une "méthode", ce n'est rien d'autre qu'une fonction propriétée d'un objet.
que j'ai créé je dois faire :
var empty={};// un objet 'vide' qui n'a donc que les pptés "parasites" puis : for(var propriete in objet){ if(!empty[propriete]){// c'est le filtre... <comme on aurait fait au premier chef...> } }
Il y a d'autre façons, plus propres, de faire ce filtrage. Par exemple, en examinant le type de la propriété pour voir si c'est une fonction.
je ne suis pas informaticien mais ça me donne le sentiment qu'en JS les "objets" ne sont pas ce qu'on appellerait "objet" en programmation objet...
Bin si, complètement. Un objet est défini par une identité, un état et un comportement. Définition nécessaire et suffisante, à laquelle répondent pleinement les objets Javascript.
ceci dit JS est un langage que je trouve très puisant surtout compte tenu de sa date de création...
ça manipule des fonctions "comme" des objets ;-)
pas "comme" - les fonctions js *sont* des objets. Ce qui, soit dit au passage, n'est pas vraiment une nouveauté en programmation (les fonctions comme type de donnée remontent au moins au premier Lisp, un des plus vieux langages existant), ni vraiment unique (Python fonctionne d'une façon très similaire de ce point de vue...).
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça
y ressemble certe, il faut filtrer certaines propriétés (function)...
En quoi cela contredit-il le fait que ce soient des tableaux associatifs?
Tu peux développer ? j'ai toujours pensé que les objets étaient
implémentés comme un tableau associatif dans javascript (de même que les
espaces de noms)
par exemple, json ajoute une méthode "toJSONString()" à tous les objets
JS.
pour balayer les propriétés d'un objet JS généralement on fait :
for(var propriete in objet){...}
c'est là où il faut filtrer car propriete pourra prendre la valeur
toJSSONString qui est égale à :
function(){< le corps de cette fonction...>};
donc, pour n'avoir QUE les propriétés de l'objet
Mais cette fonction *est* une propriété de l'objet. En Javascript, les
fonctions aussi sont des objets, et une "méthode", ce n'est rien d'autre
qu'une fonction propriétée d'un objet.
que j'ai créé je dois
faire :
var empty={};// un objet 'vide' qui n'a donc que les pptés "parasites"
puis :
for(var propriete in objet){
if(!empty[propriete]){// c'est le filtre...
<comme on aurait fait au premier chef...>
}
}
Il y a d'autre façons, plus propres, de faire ce filtrage. Par exemple,
en examinant le type de la propriété pour voir si c'est une fonction.
je ne suis pas informaticien mais ça me donne le sentiment qu'en JS les
"objets" ne sont pas ce qu'on appellerait "objet" en programmation
objet...
Bin si, complètement. Un objet est défini par une identité, un état et
un comportement. Définition nécessaire et suffisante, à laquelle
répondent pleinement les objets Javascript.
ceci dit JS est un langage que je trouve très puisant surtout compte
tenu de sa date de création...
ça manipule des fonctions "comme" des objets ;-)
pas "comme" - les fonctions js *sont* des objets. Ce qui, soit dit au
passage, n'est pas vraiment une nouveauté en programmation (les
fonctions comme type de donnée remontent au moins au premier Lisp, un
des plus vieux langages existant), ni vraiment unique (Python fonctionne
d'une façon très similaire de ce point de vue...).
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
En quoi cela contredit-il le fait que ce soient des tableaux associatifs?
Tu peux développer ? j'ai toujours pensé que les objets étaient
implémentés comme un tableau associatif dans javascript (de même que les espaces de noms)
par exemple, json ajoute une méthode "toJSONString()" à tous les objets JS.
pour balayer les propriétés d'un objet JS généralement on fait : for(var propriete in objet){...}
c'est là où il faut filtrer car propriete pourra prendre la valeur toJSSONString qui est égale à : function(){< le corps de cette fonction...>};
donc, pour n'avoir QUE les propriétés de l'objet
Mais cette fonction *est* une propriété de l'objet. En Javascript, les fonctions aussi sont des objets, et une "méthode", ce n'est rien d'autre qu'une fonction propriétée d'un objet.
que j'ai créé je dois faire :
var empty={};// un objet 'vide' qui n'a donc que les pptés "parasites" puis : for(var propriete in objet){ if(!empty[propriete]){// c'est le filtre... <comme on aurait fait au premier chef...> } }
Il y a d'autre façons, plus propres, de faire ce filtrage. Par exemple, en examinant le type de la propriété pour voir si c'est une fonction.
je ne suis pas informaticien mais ça me donne le sentiment qu'en JS les "objets" ne sont pas ce qu'on appellerait "objet" en programmation objet...
Bin si, complètement. Un objet est défini par une identité, un état et un comportement. Définition nécessaire et suffisante, à laquelle répondent pleinement les objets Javascript.
ceci dit JS est un langage que je trouve très puisant surtout compte tenu de sa date de création...
ça manipule des fonctions "comme" des objets ;-)
pas "comme" - les fonctions js *sont* des objets. Ce qui, soit dit au passage, n'est pas vraiment une nouveauté en programmation (les fonctions comme type de donnée remontent au moins au premier Lisp, un des plus vieux langages existant), ni vraiment unique (Python fonctionne d'une façon très similaire de ce point de vue...).
unbewusst.sein
Bruno Desthuilliers wrote:
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
En quoi cela contredit-il le fait que ce soient des tableaux associatifs?
pour moi, venant de C, Java et Ruby, c'est inhabituel, c'est tout, je ne retrouve pas les méthodes d'un objet dans ses propriétés.
c'est là où il faut filtrer car propriete pourra prendre la valeur toJSSONString qui est égale à : function(){< le corps de cette fonction...>};
donc, pour n'avoir QUE les propriétés de l'objet
Mais cette fonction *est* une propriété de l'objet. En Javascript, les fonctions aussi sont des objets, et une "méthode", ce n'est rien d'autre qu'une fonction propriétée d'un objet.
oui, js redéfini à sa manière ce qu'est un objet, c'est 'normal' après tout, tous les langages font ça.
var empty={};// un objet 'vide' qui n'a donc que les pptés "parasites" puis : for(var propriete in objet){ if(!empty[propriete]){// c'est le filtre... <comme on aurait fait au premier chef...> } } Il y a d'autre façons, plus propres, de faire ce filtrage. Par exemple,
en examinant le type de la propriété pour voir si c'est une fonction.
pourquoi ma méthode est-elle 'non propre' ?
-- Une Bévue
Bruno Desthuilliers <bruno.42.desthuilliers@websiteburo.invalid> wrote:
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça
y ressemble certe, il faut filtrer certaines propriétés (function)...
En quoi cela contredit-il le fait que ce soient des tableaux associatifs?
pour moi, venant de C, Java et Ruby, c'est inhabituel, c'est tout, je ne
retrouve pas les méthodes d'un objet dans ses propriétés.
c'est là où il faut filtrer car propriete pourra prendre la valeur
toJSSONString qui est égale à :
function(){< le corps de cette fonction...>};
donc, pour n'avoir QUE les propriétés de l'objet
Mais cette fonction *est* une propriété de l'objet. En Javascript, les
fonctions aussi sont des objets, et une "méthode", ce n'est rien d'autre
qu'une fonction propriétée d'un objet.
oui, js redéfini à sa manière ce qu'est un objet, c'est 'normal' après
tout, tous les langages font ça.
var empty={};// un objet 'vide' qui n'a donc que les pptés "parasites"
puis :
for(var propriete in objet){
if(!empty[propriete]){// c'est le filtre...
<comme on aurait fait au premier chef...>
}
}
Il y a d'autre façons, plus propres, de faire ce filtrage. Par exemple,
en examinant le type de la propriété pour voir si c'est une fonction.
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
En quoi cela contredit-il le fait que ce soient des tableaux associatifs?
pour moi, venant de C, Java et Ruby, c'est inhabituel, c'est tout, je ne retrouve pas les méthodes d'un objet dans ses propriétés.
c'est là où il faut filtrer car propriete pourra prendre la valeur toJSSONString qui est égale à : function(){< le corps de cette fonction...>};
donc, pour n'avoir QUE les propriétés de l'objet
Mais cette fonction *est* une propriété de l'objet. En Javascript, les fonctions aussi sont des objets, et une "méthode", ce n'est rien d'autre qu'une fonction propriétée d'un objet.
oui, js redéfini à sa manière ce qu'est un objet, c'est 'normal' après tout, tous les langages font ça.
var empty={};// un objet 'vide' qui n'a donc que les pptés "parasites" puis : for(var propriete in objet){ if(!empty[propriete]){// c'est le filtre... <comme on aurait fait au premier chef...> } } Il y a d'autre façons, plus propres, de faire ce filtrage. Par exemple,
en examinant le type de la propriété pour voir si c'est une fonction.