Opret et objekt med samme konstruktør
Forestil dig, vi har et vilkårligt objekt obj, skabt af en konstruktør funktion – vi ved ikke hvilken, men vi vil gerne skabe et nyt objekt med samme konstruktør.
Kan vi gøre det sådan?
let obj2 = new obj.constructor();
Giv et eksempel på en konstruktør funktion for obj som lader sådan kode virke korrekt. Og et eksempel som gør det forkert.
Vi kan bruge denne tilgang hvis vi er sikre på at "constructor" egenskaben har den korrekte værdi.
For eksempel, hvis vi ikke rører ved standard "prototype", så virker denne kode altid:
function User(name) {
this.name = name;
}
let user = new User('Jan');
let user2 = new user.constructor('Helene');
alert( user2.name ); // Helene (virker!)
Det virker fordi User.prototype.constructor == User.
…Men hvis en overskriver User.prototype uden at genskabe constructor som reference til User, så vil det fejle.
For eksempel:
function User(name) {
this.name = name;
}
User.prototype = {}; // (*)
let user = new User('Jan');
let user2 = new user.constructor('Helene');
alert( user2.name ); // undefined
Hvorfor er user2.name undefined?
Sådan her virker new user.constructor('Helene'):
- Først kigger den efter
constructoriuser. Intet fundet. - Derefter følger den prototypen. Prototypen af
usererUser.prototype, og den har også ingenconstructor(fordi vi “glemte” at genskabe den!). - Går videre op i kæden,
User.prototypeer et almindeligt objekt, og dens prototype er den indbyggedeObject.prototype. - Til sidst, for den indbyggede
Object.prototype, findes der en indbyggetObject.prototype.constructor == Object. Så bruges denne.
Til sidst har vi altså noget der oversat ser ud som let user2 = new Object('Helene').
Helt sikkert ikke det vi vil. Vi ønsker at skabe new User, ikke new Object. Det er resultatet af den manglende constructor.
(Bare, i det tilfælde, at du er nysgerrig: Kaldet til new Object(...) konverterer dets argument til et objekt. Det er en teoretisk ting, i praksis kalder ingen new Object med en værdi, og generelt bruger vi ikke new Object til at lave objekter).