/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
reflection
Fra : Kristian Thy


Dato : 16-05-05 13:20

Er der en nem måde at lave reflection på i Javascript?

Jeg vil gerne tilføje en metode til en prototype, men jeg kender ikke
klassens navn. typeof() returnerer bare 'object' :-/

\\kristian
--
Thomas Madsens fremragende guide til sikring af Windows:
http://home18.inet.tele.dk/madsen/windows/tjenester/

 
 
Kristian Thy (16-05-2005)
Kommentar
Fra : Kristian Thy


Dato : 16-05-05 15:31

Kristian Thy wrote:
> Er der en nem måde at lave reflection på i Javascript?

Nu fik jeg så den geniale idé at lave alert() på objektet, hvilket gav
[object: SVGGElement]. Så troede jeg at den hellige grav var
velforvaret, men min prototypefunktion her giver fejlen "SVGGElement is
undefined". Nogen gode idéer?

SVGGElement.prototype.getChildren = function(name){
var potentialChildren = new Array;
var children = new Array;
if(arguments.length<1){
potentialChildren = this.getChildNodes();
} else {
potentialChildren = this.getElementsByTagName(name);
}
for(var i=0;i<potentialChildren.length;i++){
cur = potentialChildren.item(i);
if(cur.parentNode==this) children.push(cur);
}
return children;
}

\\kristian
--
Thomas Madsens fremragende guide til sikring af Windows:
http://home18.inet.tele.dk/madsen/windows/tjenester/

Lasse Reichstein Nie~ (16-05-2005)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 16-05-05 17:18

Kristian Thy <thy@itu.dk> writes:

> Er der en nem måde at lave reflection på i Javascript?

Reflektion er et vidt begreb, som jeg slet ikke er sikker på giver så
meget mening i Javascript. Måske. På den anden side er
"typeof"-operatoren jo et eksempel på reflektion ...

Men, hvad er det helt præcist du gerne vil gøre?

> Jeg vil gerne tilføje en metode til en prototype, men jeg kender ikke
> klassens navn. typeof() returnerer bare 'object' :-/

Der er ingen klasser i Javascript.

Hvis du har et objekt, og ønsker at tilføje noget til dets prototype,
så er dit bedste gæt:

obj.constructor.prototype.property = ...;

Det kræver selvfølgelig at "constructor"-egenskaben er sat rigtigt op,
og at dens prototype-objekt kan skrives til.

Eksempel hvor et virker i min browser:
---
function Foo(){};
var x = new Foo();
var y = new Foo();
x.constructor.prototype.bar = 42;
alert(y.bar);
---

Hvis konstrutoren ikke er en du har skrevet selv, så kan det være at
enten den eller dens prototype-egenskab er et "host object", og så
er det ganske implementationsafhængigt hvad man kan med det.

Held og lykke.
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Kristian Thy (16-05-2005)
Kommentar
Fra : Kristian Thy


Dato : 16-05-05 17:55

Lasse Reichstein Nielsen wrote:
> Reflektion er et vidt begreb, som jeg slet ikke er sikker på giver så
> meget mening i Javascript. Måske. På den anden side er
> "typeof"-operatoren jo et eksempel på reflektion ...
>
> Men, hvad er det helt præcist du gerne vil gøre?

Det stod jo så herunder

>>Jeg vil gerne tilføje en metode til en prototype, men jeg kender ikke
>>klassens navn. typeof() returnerer bare 'object' :-/
>
> Der er ingen klasser i Javascript.

Nej, det er jo det der ikke er. Jeg vil så gerne tilføje en metode til
et objekts prototype.

Kunne man (hvis Object's constructor tillader det) tilføje en metode til
Object, og ville den så propagere ned gennem Object-hierarkiet? Er der
overhovedet et objekthierarki som man kender det fra Java? Jeg vil
umiddelbart tro det eftersom typeof() bare kaster "Object" tilbage, men
der er så mange mærkelige ting i Javascript.

> Hvis du har et objekt, og ønsker at tilføje noget til dets prototype,
> så er dit bedste gæt:
>
> obj.constructor.prototype.property = ...;

Hum - jeg fik idéen fra
<URL:http://www.svendtofte.com/code/usefull_prototypes/prototypes.js>
hvor det ser ud som om man kunne kalde prototype "statisk" på objektets
navn.

> Det kræver selvfølgelig at "constructor"-egenskaben er sat rigtigt op,
> og at dens prototype-objekt kan skrives til.
>
> Eksempel hvor et virker i min browser:
> ---
> function Foo(){};
> var x = new Foo();
> var y = new Foo();
> x.constructor.prototype.bar = 42;
> alert(y.bar);
> ---

Yes. Det jeg gerne ville var så at tilføje en metode til mit element
generelt (efterdi der er noget funktionalitet jeg har brug for flere
gange i mit script). Hvis jeg skal følge dit eksempel kunne jeg så bare
starte med at lave et objekt, tilføje metoden og så ville den være
tilgængelig på alle senere objekter af samme klasse. Det ser bare pænere
ud hvis man kunne lave det "statisk", altså uden at skulle lave x først
i dit eksempel:

---
function Foo(){};
Foo.prototype.bar = 42;
var y = new Foo();
alert(y.bar);
---

Det opdager jeg nu at man også kan. Det vil sige ...

> Hvis konstrutoren ikke er en du har skrevet selv, så kan det være at
> enten den eller dens prototype-egenskab er et "host object", og så
> er det ganske implementationsafhængigt hvad man kan med det.

.... at jeg formentlig har tabt fordi det ikke er mit eget objekt jeg
gerne vil udvide.

Anyhoo, jeg ser lige at jeg har overset en property der tilsyneladende
overflødiggør prototyping i det her tilfælde. Ærgeligt

\\kristian
--
Thomas Madsens fremragende guide til sikring af Windows:
http://home18.inet.tele.dk/madsen/windows/tjenester/

Lasse Reichstein Nie~ (16-05-2005)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 16-05-05 20:13

Kristian Thy <thy@itu.dk> writes:

> Kunne man (hvis Object's constructor tillader det) tilføje en metode
> til Object, og ville den så propagere ned gennem Object-hierarkiet?

Prøv det :)
Men ja.
Object.prototype.foo = 42;
alert([].foo);

> Er der overhovedet et objekthierarki som man kender det fra Java?

Der er et objekthierarki, og ikke, som man kender det fra Java, et
klassehierarki. Hvert objekt har en prototypekæde, og når man tjekker
for en property, så tjekkes først objektet selv, og så dets
prototypekæde i rækkefølge. Alle andre objekter end Object.prototype
har en ikke-tom kæde med Object.prototype i bunden (i hvert fald
hvis det er Javascript-objekter, og ikke "host objects")

> Jeg vil umiddelbart tro det eftersom typeof() bare kaster "Object"
> tilbage, men der er så mange mærkelige ting i Javascript.

Et prototypebaseret sprog er meget anderledes end et klassebaseret.
Dem der lavede Javascript forsøgte at skjule underligheden ved at
lade al objektnedarvning ske gennem konstruktor-funktioner der
lidt kunne ligne en klasse-konstruktor. Men det er snyd.

---
function clone(parent) {
function dummy(){}
dummy.prototype = parent;
return new dummy();
}

function inheritsFrom(object, parent) {
function dummy(){}
dummy.prototype = parent;
return object instanceof dummy;
}

var obj1 = [42];
var obj2 = clone(obj1);
alert(inheritsFrom(obj2, obj1));
---

"clone"-funktionen laver et nyt objekt med "parent" som første element
i prototypekæden. Selve konstruktorfunktionen bliver smidt væk igen
med det samme. På samme måde tjekker "inheritsFrom"-funktionen om
"parent" er i prototypekæden for "object", igen via en dummy-funktion
der bliver smidt væk igen (og er helt forskellig fra konstruktoren
der lavede objektet).

> Hum - jeg fik idéen fra
> <URL:http://www.svendtofte.com/code/usefull_prototypes/prototypes.js>
> hvor det ser ud som om man kunne kalde prototype "statisk" på
> objektets navn.

Det er fordi han gør det direkte på konstruktorfunktionen. Dens
prototype-egenskab er netop det der kommer i prototypekæden for de
objekter der skabes ud fra den.

> Det ser bare pænere ud hvis man kunne lave det "statisk", altså uden
> at skulle lave x først i dit eksempel:
>
> ---
> function Foo(){};
> Foo.prototype.bar = 42;
> var y = new Foo();
> alert(y.bar);
> ---
>
> Det opdager jeg nu at man også kan.

Nemlig, hvis man kender konstruktor-funktionen der bliver brugt.
Ellers er den nogengange at finde som egenskaben "constructor" på
objektet.


Held og lykke
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Søg
Reklame
Statistik
Spørgsmål : 177495
Tips : 31968
Nyheder : 719565
Indlæg : 6408489
Brugere : 218886

Månedens bedste
Årets bedste
Sidste års bedste