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...
soit un constructeur (simplifié) de Hash : function Hash(){ var _hash=new Array(),_keys=new Array(),_length=0; this.length=function(){return _length;};
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
soit un constructeur (simplifié) de Hash :
function Hash(){
var _hash=new Array(),_keys=new Array(),_length=0;
this.length=function(){return _length;};
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un
WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
soit un constructeur (simplifié) de Hash : function Hash(){ var _hash=new Array(),_keys=new Array(),_length=0; this.length=function(){return _length;};
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
unbewusst.sein
Bruno Desthuilliers wrote:
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
oui +/- MAIS je ne sais pas peupler un objet javascript.
je sais en initialiser un par ex : var monObjet={'truc':'machin','bidule':'chose'};
je ne sais pas ajouter la propriété 'div#header' et sa valeur 'background-color: red' à l'objet monObjet à moins qu'il suffise de faire (pas essayé) :
monObjet['div#header']='background-color: red';
donc, par programme, et pas "en dur" comme ci-dessus je pourrais faire : monObjet[string1]=string2;
et après cela monObjet vaudrait : {'truc':'machin','bidule':'chose','div#header':'background-color: red'};
je vais faire un bout d'essai à part...
ceci dit, en ce qui concerne l'héritage, le code posté correspond à qqc de lu sur le net :[[
j'ai trouvé une solution qui marche :
function Hash(){/* comme avant*/} function Properties(){ this.inheritFrom = Hash; this.inheritFrom(); this.cssText=function(){/* comme avant*/}; } function Selectors(){ this.inheritFrom = Hash; this.inheritFrom(); this.rule=function(selector){/* comme avant*/}; this.rules=function(){/* comme avant*/}; }
là, si je crée deux instances de Properties, ça ne se mélange + les crayons...
MAIS, comme de toutes façonc j'ai aussi un pb ailleurs, je vais tester ta solution rapidos...
-- Une Bévue
Bruno Desthuilliers <bruno.42.desthuilliers@websiteburo.invalid> wrote:
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un
WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
oui +/- MAIS je ne sais pas peupler un objet javascript.
je sais en initialiser un par ex :
var monObjet={'truc':'machin','bidule':'chose'};
je ne sais pas ajouter la propriété 'div#header' et sa valeur
'background-color: red' à l'objet monObjet à moins qu'il suffise de
faire (pas essayé) :
monObjet['div#header']='background-color: red';
donc, par programme, et pas "en dur" comme ci-dessus je pourrais faire :
monObjet[string1]=string2;
et après cela monObjet vaudrait :
{'truc':'machin','bidule':'chose','div#header':'background-color: red'};
je vais faire un bout d'essai à part...
ceci dit, en ce qui concerne l'héritage, le code posté correspond à qqc
de lu sur le net :[[
j'ai trouvé une solution qui marche :
function Hash(){/* comme avant*/}
function Properties(){
this.inheritFrom = Hash;
this.inheritFrom();
this.cssText=function(){/* comme avant*/};
}
function Selectors(){
this.inheritFrom = Hash;
this.inheritFrom();
this.rule=function(selector){/* comme avant*/};
this.rules=function(){/* comme avant*/};
}
là, si je crée deux instances de Properties, ça ne se mélange + les
crayons...
MAIS, comme de toutes façonc j'ai aussi un pb ailleurs, je vais tester
ta solution rapidos...
je ne sais pas ajouter la propriété 'div#header' et sa valeur 'background-color: red' à l'objet monObjet à moins qu'il suffise de faire (pas essayé) :
monObjet['div#header']='background-color: red';
donc, par programme, et pas "en dur" comme ci-dessus je pourrais faire : monObjet[string1]=string2;
et après cela monObjet vaudrait : {'truc':'machin','bidule':'chose','div#header':'background-color: red'};
je vais faire un bout d'essai à part...
ceci dit, en ce qui concerne l'héritage, le code posté correspond à qqc de lu sur le net :[[
j'ai trouvé une solution qui marche :
function Hash(){/* comme avant*/} function Properties(){ this.inheritFrom = Hash; this.inheritFrom(); this.cssText=function(){/* comme avant*/}; } function Selectors(){ this.inheritFrom = Hash; this.inheritFrom(); this.rule=function(selector){/* comme avant*/}; this.rules=function(){/* comme avant*/}; }
là, si je crée deux instances de Properties, ça ne se mélange + les crayons...
MAIS, comme de toutes façonc j'ai aussi un pb ailleurs, je vais tester ta solution rapidos...
-- Une Bévue
Bruno Desthuilliers
Bruno Desthuilliers wrote:
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
oui +/- MAIS je ne sais pas peupler un objet javascript.
Alors pourquoi tu ne demande pas au lieu de donner dans le rub goldberg ?-)
je sais en initialiser un par ex : var monObjet={'truc':'machin','bidule':'chose'};
ceci dit, en ce qui concerne l'héritage, le code posté correspond à qqc de lu sur le net :[[
En ce qui concerne Javascript, il y a une quantité invraisemblable de c...ries qui trainent sur le net.
ouais, il faut en avoir fait les frais pour le savoir...
j'ai trouvé une solution qui marche :
Peut-être mais sais-tu *pourquoi* ça marche ?
pas du tout, c'est ce qui me gène, ma nouvelle solution, avec des objetx "basiques", marche déjà...
elle n'a pas besoin d'héritage...
ceci dit j'aimerais bien piger pourquoi la première solution, concernant l'héritage ne marche pas et aussi pourquoi la seconde marche...
m'enfin -- Une Bévue
BertrandB
soit un constructeur (simplifié) de Hash : function Hash(){ var _hash=new Array(),_keys=new Array(),_length=0; this.length=function(){return _length;};
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
Je crois qu'une grande source d'erreur est que certain pensent que
javascript c'est proche de java puisque ça commence pareil. Alors que c'est fondamentalement différent. On trouvera donc toujours des personnes ayant appris les objets avec java ou C++ qui voudront retranscrire directement ce qu'ils aurront appris.
soit un constructeur (simplifié) de Hash :
function Hash(){
var _hash=new Array(),_keys=new Array(),_length=0;
this.length=function(){return _length;};
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un
WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
Je crois qu'une grande source d'erreur est que certain pensent que
javascript c'est proche de java puisque ça commence pareil.
Alors que c'est fondamentalement différent.
On trouvera donc toujours des personnes ayant appris les objets avec
java ou C++ qui voudront retranscrire directement ce qu'ils aurront appris.
soit un constructeur (simplifié) de Hash : function Hash(){ var _hash=new Array(),_keys=new Array(),_length=0; this.length=function(){return _length;};
Heu... je vais peut-être dire une bêtise, mais ça m'a un peu l'air d'un WTF, ton truc. Un objet javascript est *déjà* un tableau associatif.
Je crois qu'une grande source d'erreur est que certain pensent que
javascript c'est proche de java puisque ça commence pareil. Alors que c'est fondamentalement différent. On trouvera donc toujours des personnes ayant appris les objets avec java ou C++ qui voudront retranscrire directement ce qu'ils aurront appris.
unbewusst.sein
BertrandB wrote:
On trouvera donc toujours des personnes ayant appris les objets avec java ou C++ qui voudront retranscrire directement ce qu'ils aurront appris.
ce que j'ai fait, mais venant de Ruby...
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
On trouvera donc toujours des personnes ayant appris les objets avec java ou C++ qui voudront retranscrire directement ce qu'ils aurront appris.
ce que j'ai fait, mais venant de Ruby...
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
-- Une Bévue
unbewusst.sein
Bruno Desthuilliers wrote:
j'ai trouvé une solution qui marche :
Peut-être mais sais-tu *pourquoi* ça marche ?
euh, quand même, je reviens sur ce que j'ai écrit, là : this.inheritFrom = Hash; this.inheritFrom();
"inheritFrom" c'est >>built-in<< JS donc... le nommage me semble assez clair.
mais il est vrai que sur le net il y a pas mal d'articles >>très sérieux<<, enfin qui se présentent comme tels, et qui sont FAUX, hier aprem's j'en ai encore fait l'expérience.
une méthode|syntaxe originale pour créer un constructeur, j'ai essayé et j'ai mis un bout de temps à comprendre qu'une fois une première instance créée, avec ce "constructeur", toutes les instances suivantes avaient des valeurs de propriétés identiques...
-- Une Bévue
Bruno Desthuilliers <bruno.42.desthuilliers@websiteburo.invalid> wrote:
j'ai trouvé une solution qui marche :
Peut-être mais sais-tu *pourquoi* ça marche ?
euh, quand même, je reviens sur ce que j'ai écrit, là :
this.inheritFrom = Hash;
this.inheritFrom();
"inheritFrom" c'est >>built-in<< JS donc...
le nommage me semble assez clair.
mais il est vrai que sur le net il y a pas mal d'articles >>très
sérieux<<, enfin qui se présentent comme tels, et qui sont FAUX, hier
aprem's j'en ai encore fait l'expérience.
une méthode|syntaxe originale pour créer un constructeur, j'ai essayé et
j'ai mis un bout de temps à comprendre qu'une fois une première instance
créée, avec ce "constructeur", toutes les instances suivantes avaient
des valeurs de propriétés identiques...
euh, quand même, je reviens sur ce que j'ai écrit, là : this.inheritFrom = Hash; this.inheritFrom();
"inheritFrom" c'est >>built-in<< JS donc... le nommage me semble assez clair.
mais il est vrai que sur le net il y a pas mal d'articles >>très sérieux<<, enfin qui se présentent comme tels, et qui sont FAUX, hier aprem's j'en ai encore fait l'expérience.
une méthode|syntaxe originale pour créer un constructeur, j'ai essayé et j'ai mis un bout de temps à comprendre qu'une fois une première instance créée, avec ce "constructeur", toutes les instances suivantes avaient des valeurs de propriétés identiques...
-- Une Bévue
BertrandB
BertrandB wrote:
On trouvera donc toujours des personnes ayant appris les objets avec java ou C++ qui voudront retranscrire directement ce qu'ils aurront appris.
ce que j'ai fait, mais venant de Ruby...
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
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)
On trouvera donc toujours des personnes ayant appris les objets avec java ou C++ qui voudront retranscrire directement ce qu'ils aurront appris.
ce que j'ai fait, mais venant de Ruby...
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
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)
unbewusst.sein
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)...
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 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...> } }
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...
ceci dit JS est un langage que je trouve très puisant surtout compte tenu de sa date de création...
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça
y ressemble certe, il faut filtrer certaines propriétés (function)...
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 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...>
}
}
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...
ceci dit JS est un langage que je trouve très puisant surtout compte
tenu de sa date de création...
Cependant en JS, un object n'est pas vraiment un tableau associatif, ça y ressemble certe, il faut filtrer certaines propriétés (function)...
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 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...> } }
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...
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 ;-)
-- Une Bévue
Alex Marandon
Une Bévue wrote:
par exemple, json ajoute une méthode "toJSONString()" à tous les objets JS.
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?
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...>};
Voici un petit test effectué à l'aide de Firebug[1] qui fournit console.debug():
var o = {}; for (var p in o) { console.debug(p); } o.foo = 42 42
for (var p in o) { console.debug(p); } foo
Mon objet n'a bien que les propriétés que je lui ai affectées.
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...
JavaScript est un langage objet mais qui n'utilise pas la notion de classes, c'est pourquoi il parait effectivement atypique.
ça manipule des fonctions "comme" des objets ;-)
En fait, les fonctions *sont* des objets :-)
var f = new Function("console.debug('Foo=' + arguments.callee.foo)") f.foo = 42 42
f() FooB
function f() { console.debug('Foo=' + arguments.callee.foo) } f() Foo=undefined
f.foo = 42 42
f() FooB
Comme tu le vois, une fonction est un objet de type Function. Elle peut avoir des propriétés comme tout autre objet.
[1] http://getfirebug.com/
Une Bévue wrote:
par exemple, json ajoute une méthode "toJSONString()" à tous les objets
JS.
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?
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...>};
Voici un petit test effectué à l'aide de Firebug[1] qui fournit
console.debug():
var o = {};
for (var p in o) { console.debug(p); }
o.foo = 42
42
for (var p in o) { console.debug(p); }
foo
Mon objet n'a bien que les propriétés que je lui ai affectées.
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...
JavaScript est un langage objet mais qui n'utilise pas la notion de
classes, c'est pourquoi il parait effectivement atypique.
ça manipule des fonctions "comme" des objets ;-)
En fait, les fonctions *sont* des objets :-)
var f = new Function("console.debug('Foo=' + arguments.callee.foo)")
f.foo = 42
42
f()
FooB
function f() { console.debug('Foo=' + arguments.callee.foo) }
f()
Foo=undefined
f.foo = 42
42
f()
FooB
Comme tu le vois, une fonction est un objet de type Function. Elle peut
avoir des propriétés comme tout autre objet.
par exemple, json ajoute une méthode "toJSONString()" à tous les objets JS.
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?
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...>};
Voici un petit test effectué à l'aide de Firebug[1] qui fournit console.debug():
var o = {}; for (var p in o) { console.debug(p); } o.foo = 42 42
for (var p in o) { console.debug(p); } foo
Mon objet n'a bien que les propriétés que je lui ai affectées.
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...
JavaScript est un langage objet mais qui n'utilise pas la notion de classes, c'est pourquoi il parait effectivement atypique.
ça manipule des fonctions "comme" des objets ;-)
En fait, les fonctions *sont* des objets :-)
var f = new Function("console.debug('Foo=' + arguments.callee.foo)") f.foo = 42 42
f() FooB
function f() { console.debug('Foo=' + arguments.callee.foo) } f() Foo=undefined
f.foo = 42 42
f() FooB
Comme tu le vois, une fonction est un objet de type Function. Elle peut avoir des propriétés comme tout autre objet.