je colle... (héritage)

Le
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)+
'
{'+tab+this.valueOf(this.keyAt(i)).cssText()+'}';}
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Desthuilliers
Le #2117421
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
Le #2119981
Bruno Desthuilliers

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

Bruno Desthuilliers
Le #2121171
Bruno Desthuilliers
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)


unbewusst.sein
Le #2124111
Bruno Desthuilliers
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


BertrandB
Le #2274081
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
Le #2370211
BertrandB
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
Le #2370201
Bruno Desthuilliers
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


BertrandB
Le #2373151
BertrandB
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
Le #2379001
BertrandB
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(){
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...
}
}

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
Le #2470291
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(){

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/



Publicité
Poster une réponse
Anonyme