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