JS 1.9 Prototype inheritance
Table of contents
Prototype
Protoype är som en dold property som finns i alla JavaScript objekt som innehåller olika typer av bas-funktionalitet. Den används när vi gör arv (inheritance).
const person = {
name: 'Fred'
};
console.log(person.__proto__);
console.dir(person)
Object
name: "Fred"
[[Prototype]]: Object
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
__proto__: (...)
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
Inheritance/arv
Vi gör två classer, varav den andra extendar den första.
class Animal {
eats = true;
canEat() {
console.log(this.eats);
}
}
class Dog extends Animal {
name = 'Fred';
}
Vi gör en instans av den extendade classen Dog och tittar på dess property.
const dog = new Dog();
console.dir(dog);
Vi kan se att den har ärvt eats, men vi kan också se att i Dog-protoype så finns också Animal-prototype.
Dog
├─ eats: true
├─ name: "Fred"
└─ Dog-prototype
└─ Animal-prototype
Dog har alltså också ärvt metoden canEat() från Animal.
console.log(dog.canEat); // true
Object.prototype
Alla JavaScript objekt har en objekt-prototyp som ärvs från Object, men det sker automatiskt och behöver inte skrivas ut.
Exempel
const myObject = {
a: 1,
b: 2,
c: 3
};
För att kolla om myObject innehåller propertyn a, så kan vi kalla myObject.hasOwnProperty('a'), trots att hasOwnProperty inte är definierat i myObject. Detta beror på att myObject (och alla andra eventuella objekt vi gör i JavaScript) har ärvt funktionalitet från prototypen Object.prototype, som har hasOwnProperty definierad (se ovan).