Ten article definiuje instanceof jak poniżej:Javascript: Still mylić przez operatora instanceof
testy operatorskieinstanceof czy obiekt posiada w swoim prototypem łańcucha własności prototypu konstruktora.
To rzetelne wyjaśnienie, a życie było dobre, aż natknąłem tego kodu z książki Eloquent javascript:
function TextCell(text) {
this.text = text.split("\n");
}
TextCell.prototype.minWidth = function() {
return this.text.reduce(function(width, line) {
return Math.max(width, line.length);
}, 0);
}
TextCell.prototype.minHeight = function() {
return this.text.length;
}
TextCell.prototype.draw = function(width, height) {
var result = [];
for (var i = 0; i < height; i++) {
var line = this.text[i] || "";
result.push(line + repeat(" ", width - line.length));
}
return result;
}
function RTextCell(text) {
TextCell.call(this, text);
}
RTextCell.prototype = Object.create(TextCell.prototype);
RTextCell.prototype.draw = function(width, height) {
var result = [];
for (var i = 0; i < height; i++) {
var line = this.text[i] || "";
result.push(repeat(" ", width - line.length) + line);
}
return result;
};
Stwórzmy wystąpienie RTextCell i wykonać poniżej c
var rt = new RTextCell("ABC");
console.log(rt instanceof RTextCell); // true
console.log(rt instanceof TextCell); // true
Rozumiem, dlaczego dane wyjściowe drugiego pliku console.log są "prawdziwe" - ponieważ konstruktor TextCell jest częścią łańcucha prototypów.
Jednak 1. console.log myli mnie.
Jeśli spojrzysz na kod (dziesiąta linia od dołu), prototyp RTextCell zostanie zaktualizowany do nowego obiektu, którego prototyp jest ustawiony na TextCell.prototype.
RTextCell.prototype = Object.create(TextCell.prototype);
.
Patrząc na migawki poniżej, nie ma wzmianki o konstruktorze "RTextCell" w prototypowym łańcuchu obiektu "rt". Więc, idąc za definicją, o której wspomniałem na początku mojego postu, czy wynik nie powinien być fałszywy? Dlaczego zwraca prawdziwą wartość?
Czytałem również this, ale nie pomogło mi zrozumieć tego konkretnego problemu.
Zobacz poniżej migawki rt, RTextCell, TextCell w tej kolejności.
To naprawdę dobrze skonstruowane pytanie. Pokazałeś wszystkie swoje poprzednie dochodzenie, masz nadzieję, że otrzymasz bardzo dobre odpowiedzi. –
Oh! Powinienem dodać. Sprawdziłem to drzewo prototypów w powyższych migawkach w obu wersjach chrome 43.0.2357.65 i firefox 33.1.1. – Harish