Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

je colle... (héritage)

13 réponses
Avatar
unbewusst.sein
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 la lumière ???
--
Une Bévue

10 réponses

1 2
Avatar
Bruno Desthuilliers
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.

Avatar
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'};

supposons que par ailleurs j'ai deux string :

string1='div#header';
string2='background-color: red';

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

Avatar
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'};

supposons que par ailleurs j'ai deux string :

string1='div#header';
string2='background-color: red';

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';


Bin voilà.

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...


t'aurais peut-être pu commencer par là, non ?-)

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.

j'ai trouvé une solution qui marche :


Peut-être mais sais-tu *pourquoi* ça marche ?

(snip)


Avatar
unbewusst.sein
Bruno Desthuilliers wrote:

t'aurais peut-être pu commencer par là, non ?-)


ben ma foi oui nem' don !


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


Avatar
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.


Avatar
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)...


--
Une Bévue

Avatar
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


Avatar
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)


Avatar
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...

ça manipule des fonctions "comme" des objets ;-)


--
Une Bévue


Avatar
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/



1 2