Как работает метод доступа к супертипу? Пытаюсь разобраться с примером. В данном примере перезаписывается метод toString, но вызов rect.toString() не срабатывает. Подскажите пожалуйста, почему ? И как здесь происходит перезапись?function Rectangle(length, width) { this.length = length; this.width = width; } Rectangle.prototype.getArea = function() { return this.length * this.width; }; Rectangle.prototype.toString = function() { return "[Rectangle " + this.length + "x" + this.height + "]"; }; function Square(size) { Rectangle.call(this, size, size); } Square.prototype = Object.create(Rectangle.prototype, { constructor: { configurable: true, enumerable: true, value: Square, writable: true } }); // Что происходит в данном коде ??? Square.prototype.toString = function() { var text = Rectangle.prototype.toString.call(this); return text.replace("Rectangle", "Square"); }; var rect = new Rectangle(5, 10); var square = new Square(6); console.log(rect.getArea()); console.log(square.getArea()); console.log(rect.toString()); console.log(square.toString());
При вызове rect.toString() действительно не сработает, так как у объекта rect не определено свойство height, а в методе toString для Rectangle используется this.height, которое в данном случае будет undefined.
Перезапись метода toString происходит в следующей строчке кода:
Square.prototype.toString = function() { var text = Rectangle.prototype.toString.call(this); return text.replace("Rectangle", "Square"); };
Здесь создается новый метод toString для объекта Square, который сначала вызывает метод toString у прототипа Rectangle для текущего объекта (this) с помощью call(this), затем заменяет возвращаемую строку "Rectangle" на "Square".
Таким образом, вы увидите строку, возвращаемую методом toString для объекта square, в которой будет указано, что это Square, а не Rectangle.
При вызове rect.toString() действительно не сработает, так как у объекта rect не определено свойство height, а в методе toString для Rectangle используется this.height, которое в данном случае будет undefined.
Перезапись метода toString происходит в следующей строчке кода:
Square.prototype.toString = function() {var text = Rectangle.prototype.toString.call(this);
return text.replace("Rectangle", "Square");
};
Здесь создается новый метод toString для объекта Square, который сначала вызывает метод toString у прототипа Rectangle для текущего объекта (this) с помощью call(this), затем заменяет возвращаемую строку "Rectangle" на "Square".
Таким образом, вы увидите строку, возвращаемую методом toString для объекта square, в которой будет указано, что это Square, а не Rectangle.