hishadow Skrevet 15. desember 2007 Del Skrevet 15. desember 2007 (endret) Etter å ha trålt nettet etter enkle løsninger til multiple arv i Javascript, men de fleste eksemplene jeg kom over var en del kompliserte. Under er et veldig enkelt hybrid-forsøk fra løsningene jeg kom over til noe enklere, men jeg er fortsatt ikke sikker på hvor "riktig" dette blir. Kritikk ønskes. Under følger funksjonen som arver/kopierer attributter/metoder fra foreldreklassene. Denne tar som argumenter klassen som skal arve, etterfulgt av alle klassene den skal arve ifra. Går slavisk igjennom alle registrerte attributter/metoder registrert i klassenes prototype objekt. Kopiering av attributter/metoder prioriteres etter rekkefølgen til arveklassene, så hvis en senere klasse har lik attributt/metode som en forrige vil disse ikke kopieres til klassen som mottar arv. function inheritClasses() { // Make a copy of all parent classes prototypes attributes and methods (ignoring duplicate attributes and methods). for(var i = 1; i < arguments.length; i++) { for(var key in arguments[i].prototype) { if(arguments[0].prototype.key == null) arguments[0].prototype[key] = arguments[i].prototype[key]; } } } Konstruktørene til arvede klasser må kalles fra klassen som mottar arv ved hjelp av Javascript functionen call(), som kan kalle en metode til en klasse på vegne av det arvede object (this). Under er et eksempel på en KlasseA som arver fra både KlasseB og KlasseC, samt konstruktøren til KlasseA som også kaller konstruktørene til arveklassene KlasseB og KlasseC. function ClassA(attribute1, attribute2, attribute3) { this.attribute1 = attribute1; ClassB.call(this, attribute2); ClassC.call(this, attribute3); } inheritClasses(ClassA, ClassB, ClassC) function ClassB(attribute2) { this.attribute2 = attribute2; } function ClassC(attribute3) { this.attribute3 = attribute3; } Noen gang kan det være nyttig å delegere et metodekall videre til klassen det ble arvet ifra. Dette gjøres ved å akserere prototype objektet til den arvede klassen, for så å kalle metoden til den arvede klassen. Dette gjøres ved å bruke Javascript metoden apply() som kan kalle en metode til en klasse på vegne av et objekt (this), slik som for call(). For apply() trenger man heller ikke spesifiere alle argumenter til metoden som kalles, siden man kan bruke argumentet kalt arguments. Denne inneholder alle argumenter til metoden som nå kalles. ClassA.prototype.someMethod = function(attribute1, attribute2) { return ClassB.prototype.someMethod.apply(this, arguments); } Under er et litt større eksempel på hvordan flere klasser kan arves. Eksemplet kan testes fra på denne lenken. function inheritClasses() { // Make a copy of all parent classes prototypes attributes and methods (ignoring duplicate attributes and methods). for(var i = 1; i < arguments.length; i++) { for(var key in arguments[i].prototype) { if(arguments[0].prototype.key == null) arguments[0].prototype[key] = arguments[i].prototype[key]; } } } function Person(navn) { document.write("En ny person er opprettet.<br>"); this.navn = navn; } function Skattebetaler(skatteprosent) { document.write("En ny skattebetaler er opprettet.<br>"); this.skatteprosent = skatteprosent; this.betaltSkatt = 0; } Skattebetaler.prototype.betalSkatt = function(lønn) { var skatteTrekk = lønn * this.skatteprosent; document.write("Skattetrekk for lønning: " + skatteTrekk + "<br>"); this.betaltSkatt += skatteTrekk; document.write("Totalt betalt skatt:" + this.betaltSkatt + "<br>"); return lønn - skatteTrekk; } function Arbeidstaker(navn, stilling, skatteprosent) { document.write("En ny arbeidstaker er opprettet.<br>"); this.stilling = stilling; this.saldo = 0; Person.call(this, navn); Skattebetaler.call(this, skatteprosent); } inheritClasses(Arbeidstaker, Person, Skattebetaler); Arbeidstaker.prototype.mottaLønn = function(bruttoLønn) { document.write(this.navn + " har mottatt brutto lønn: " + bruttoLønn + "<br>"); var nettoLønn = this.betalSkatt(bruttoLønn); document.write(this.navn + " sitter igjen med netto lønn: " + nettoLønn + "<br>"); this.saldo += nettoLønn; document.write(this.navn + " sin saldo er: " + this.saldo + "<br>"); } var arbeidstaker = new Arbeidstaker("Fattig", "Kommuneansatt", 0.8); arbeidstaker.mottaLønn(10000); arbeidstaker.mottaLønn(5000); Endret 15. desember 2007 av hishadow Lenke til kommentar
magicgunnar Skrevet 18. desember 2007 Del Skrevet 18. desember 2007 Jeg har brukt en litt enklere variant, modifisert fra et eksempel fra boka til O'Reilly Javascript side 171: ClassA.prototype.extendClass = function (toObject, fromObject){ //Function borrowed from page 171 O'Reilly Javascript var to = toObject.prototype; var from = fromObject.prototype; for (var m in from) { if (typeof from[m] != "function") continue; to[m] = from[m]; } } Den kopierer bare funksjonene over fra en klasse til en annen, men jeg hadde ikke behov for mer. Den kaller jeg med: this.extendClass(ClassA.ClassB, ClassA.ClassC); Lenke til kommentar
hishadow Skrevet 18. desember 2007 Forfatter Del Skrevet 18. desember 2007 (endret) Jeg har brukt en litt enklere variant, modifisert fra et eksempel fra boka til O'Reilly Javascript side 171:... Ser denne hopper over attributter. De trengs vel ikke kopieres siden de vil bli opprettet når en lagrer til dem? Endret 18. desember 2007 av hishadow Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå