Link Search Menu Expand Document (external link)

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