Переопределение метода JavaScript - PullRequest
1 голос
/ 04 июля 2011

Я новичок в ООП в JavaScript.Я не могу понять это правильно, когда хочу переопределить метод.Я сделал пример моей проблемы ниже.Также в http://jsfiddle.net/sRyQA/

function myGeometryObject(r, x, y){

    this.r = r;
    this.x = x;
    this.y = y;

    var OBJ = this;

    this.returnArea = function(){
        return 'wrong override';
    }
}

function myRectangle(r, x, y){
    myGeometryObject.call(this, r, x, y);
}
myRectangle.prototype = new myGeometryObject();

myRectangle.prototype.returnArea = function(){
    return 'right override';//I want JS to use this method
}
var rectangle = new myRectangle(0, 5, 5);
alert(rectangle.returnArea());

1 Ответ

8 голосов
/ 04 июля 2011

Проблема в том, что

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;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...