Prototype og arv

Innhold

Constructor (konstruktør)

function Developer(name) {
    this.name = name;

    this.sayHello = function() {
        return 'Hallo verden fra ' + this.name;
    }
};

var tor = new Developer('Tor');
console.log(tor.sayHello());
	

Prototype

Nå vi ser etter en egenskap eller en metode på et objekt, leter nettleseren først gjennom det aktuelle objektet. Deretter forsøker den å se om egenskapen eller metoden finnes i prototypen til objektet.

Hvis nettleseren når Objekt-objektet og ikke finner egenskapen/metoden der, returnerer den undefined

Alle funksjoner har en prototype-property

function HTMLUtvikler(name) {
	this.name = name;
}    	

HTMLUtvikler.prototype = new Developer();
var thomas = new HTMLUtvikler('Thomas');

console.log(thomas.sayHello());
    

Vi kan legge metoder både på constructorfunksjonen og i prototypen. Metoder som ligger i prototypen er mer minneeffektivt. Hastigheten er den nesten den samme

Developer.prototype.sayHello =  function() {
        return 'Hallo verden fra ' + this.name;
    }   
    

Funksjonsbasert konstruksjon

En annen måte å lage objekter på er åreturnere et objekt fra funksjonen vår istedenfor å bruke new

Vi får da en objekt-«factory»

function developer(name) {
    return {
    	name:name,
    	sayHello: function() {
	        return 'Hallo verden fra ' + this.name;
    	}
    }
};	
var britt = developer('Britt');
console.log(britt.sayHello());
    

For å sette prototypen til det returnerte objektet, kan vi benytte oss av Object.create

Object.create finnes ikke i alle Javascriptmotorer. Douglas Crockford har laget følgende metode:

if (typeof Object.create !== 'function') {
	Object.create = function (o) {
		function F() {}
	   	F.prototype = o;
    	return new F();
    };
} 

var Kristoffer = Object.create(britt);
Kristoffer.name = 'Kristoffer';
console.log(Kristoffer.sayHello());

Oppgave 3

Lag en Porche og en Volvo stasjonsvogn som arver et bilobjekt, med nødvendige egenskaper og metoder.