Проблема в том, что
this.returnArea = function(){
return 'wrong override';
}
установит свойство этого конкретного экземпляра (поскольку вы правильно вызываете конструктор родителя для нового MyRectangle
instance), и это «переопределит» все унаследованные методы.
Ваша цепочка прототипов выглядит следующим образом:
+------------------+ +------------------+ +------------------+
| MyRectangle | | MyRectangle | | MyGeometry |
| instance |------->| prototype |------->| prototype |
| | | | | |
| wrong returnArea | | right returnArea | | |
+------------------+ +------------------+ +------------------+
(MyGeometry instance)
, где метод retunArea
в экземпляре - это тот, который вы назначаете в конструкторе MyGeometryObject
, а метод прототипа - этотот, который вы перезаписали.
Но если вы назначите этот метод для MyGeometryObject
prototype
function MyGeometryObject(r, x, y) {
this.r = r;
this.x = x;
this.y = y;
}
MyGeometryObject.prototype.returnArea = function(){
return 'wrong override';
}
, он будет работать, так как правильный метод returnArea
появится раньшев цепочке прототипов:
+------------------+ +------------------+ +------------------+
| MyRectangle | | MyRectangle | | MyGeometry |
| instance |------->| prototype |------->| prototype |
| | | | | |
| | | right returnArea | | wrong returnArea |
+------------------+ +------------------+ +------------------+
(MyGeometry instance)
Дополнительные примечания:
- Имена функций конструктора должны начинаться с заглавной буквы.
Если вы установите прототип MyRectangle
таким образом, вам также следует установить для свойства constructor
значение MyRectangle
:
MyRectangle.prototype = new MyGeometryObject();
MyRectangle.prototype.constructor = MyRectangle;