我是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());
答案 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