Я нарисовал следующую картину, демонстрирующую, как объекты наследуются (конструкторы функций отмечены как синие, объекты, созданные из этих конструкторов, помечены как зеленые):
Вот код, создающий такую иерархию:
function Figure() {}
function Rect() {}
Rect.prototype = new Figure();
function Square() {}
Square.prototype = new Rect();
function Ellipse() {}
Ellipse.prototype = new Figure();
function Circle() {}
Circle.prototype = new Ellipse();
Теперь я хочу проверить, наследуется ли new Square()
от Rect
, поэтому я ожидаю, что механизм JavaScript проверяет его:
var s = new Square();
s instanceof Rect // ?
s.__proto__ === Rect.prototype // false
new Rect() new Figure()
s.__proto__.__proto__ === Rect.prototype // true
new Figure() new Figure()
Итак s instanceof Rect
должен возвращать true
. Это ожидается и на самом деле возвращается, если я запускаю код. Но затем я хочу проверить, наследуется ли new Circle()
от Rect
, поэтому я следую той же логике:
var c = new Circle();
c instanceof Rect // ?
c.__proto__ === Rect.prototype // false
new Ellipse() new Figure()
c.__proto__.__proto__ === Rect.prototype // true
new Figure() new Figure()
Итак, использование этой логики проверки c instanceof Rect
должно возвращать true
, но если я действительно запускаю код, c instanceof Rect
возвращает false. Неужели я не понимаю механизм оператора instanceof
?