覆盖javascript方法

时间:2011-07-04 12:23:25

标签: javascript oop

我是javascript的OOP新手。当我想覆盖一个方法时,我无法做到正确。我在下面举例说明了我的问题。也在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 个答案:

答案 0 :(得分:8)

问题在于

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

将设置该特定实例的属性(因为您正确在新的MyRectangle实例上调用父的构造函数),这将“覆盖” “所有继承的方法。

您的原型链如下所示:

 +------------------+        +------------------+        +------------------+
 | MyRectangle      |        | MyRectangle      |        | MyGeometry       |
 | instance         |------->| prototype        |------->| prototype        |
 |                  |        |                  |        |                  |
 | wrong returnArea |        | right returnArea |        |                  |
 +------------------+        +------------------+        +------------------+
                             (MyGeometry instance)

其中实例的retunArea方法是您在MyGeometryObject构造函数中指定的方法,而原型之一是您已覆盖的方法。

但是,如果您将此方法分配给MyGeometryObject的{​​{1}}

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