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