Jeśli zamienić linię
Me.prototype.constructor = Me; // Why?
z
console.log(Me.prototype.constructor);
Me.prototype.constructor = Me; // Why?
można zauważyć, że przed ustawieniem go Me.prototype.constructor
jest You
, ponieważ Me.prototype
jest instancją You
ze względu na linii
Me.prototype = new You();
Tak, linia z th e // Why?
komentarz jest konieczny, aby "naprawić" to błędne wrażenie, że dałeś JavaScript, robiąc dziedziczenie w ten sposób.
Zasadniczo problem pojawia się, ponieważ próbujesz użyć prototypowego dziedziczenia do implementacji klasycznego dziedziczenia. Prototypowe dziedziczenie działa na instancjach obiektów i nie ma koncepcji "klas", a nawet "typów", ale JavaScript sprawia, że rzeczy stają się bardziej mylące z całym biznesem new
, .constructor
i instanceof
.
Bardziej prototypal sposób prowadzenia tego rodzaju rzeczą jest, aby unikać konstruktorów na rzecz konstruktorów elektrowni, czyli funkcji, które zwracają obiekt o formie chec:
function begetPart(partNumber, description) {
return Object.create({}, {
number: { value: partNumber },
description: { value: description },
describe: {
value: function() {
alert(this.description);
}
}
});
}
function begetTire(partNumber, speed) {
return Object.create(
begetPart(partNumber, "A tire"),
{
speed: { value: speed },
describe: {
value: function() {
alert(this.description + "; speed = " + this.speed);
}
}
}
);
}
var genericPart = begetPart(1234, "A widget");
genericPart.describe(); // alerts "A widget"
var tire = begetTire(4567, "fast");
tire.describe(); // alerts "A tire; speed = fast"
Tutaj używamy Object.create
powiedzieć " utwórz instancję obiektu na podstawie tej innej instancji obiektu ". Inną instancją jest nowy, pusty obiekt dla begetPart
i nową "instancją części" z niektórymi właściwościami wstępnie wypełnionymi dla begetTire
.
To lepiej odzwierciedla działanie JavaScript i prototypowego dziedziczenia, ponieważ w dziedziczeniu prototypowym instancje obiektów dziedziczą z innych instancji obiektów, bez tego całego pomysłu "typy" lub "klasy".
Wierzę, że starsze przeglądarki sprawdzają właściwość '.constructor' dla słowa kluczowego" instanceof ". – Raynos
Jest to książka z 2006 roku. –