我正在使用js.class,我希望能够在子类中调用超类的函数。我知道我可以使用this.callSuper()
从超类中调用当前重写的函数,但是调用其他重写函数呢?
例如在Java中,我可以这样做:
class SuperClass {
void myMethod() {
// Do something!
}
}
class SubClass extends SuperClass {
void myMethod() {
// Do something else!
}
void anotherMethod() {
super.myMethod(); // call the original myMethod form the SuperClass
}
}
是否可以在js.class中使用?!
答案 0 :(得分:1)
如果您知道js.class
超A
的内容,则可以在没有B
的情况下进行投放:
A = function (x) { this.x = x};
A.prototype.myMethod = function () {return this.x + 1};
B = function (x) { A.call(this,x)};
B.prototype = new A();
B.prototype.myMethod = function () {return this.x + 2};
B.prototype.anotherMethod = function () {return A.prototype.myMethod.call(this)};
如果您不知道谁是B的父母,您可以使用__proto__
支持的地方:
B.prototype.anotherMethod = function () {this.__proto__.myMethod.call(this)};
如果你真的需要js.class
试试这个(立即检查):
var A = new Class({
extend: {
inherited: function(childClass) {
childClass.super = this.klass;
}
},
initialize: function(x) {
this.x = x;
},
myMethod: function() {
return this.x + 1;
}
});
var B = new Class(A, {
initialize: function(x) {
this.callSuper(x);
},
myMethod: function() {
return this.x + 2;
},
anotherMethod: function () {
return this.super.myMethod()
}
});
答案 1 :(得分:1)
是的,可以通过一些关于“类”如何在JavaScript中工作的知识来实现。
JavaScript类基础知识
(如果您已经知道,可以跳过此部分)
JavaScript中的“类”实际上只是一个具有名为prototype
的属性的Function对象。此prototype
属性提供默认实例方法和属性。
我们来看两个示例类Point
和Point3D
。
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype = {
x: 0,
y: 0,
constructor: Point,
isAbove: function(point) {
return this.y > point.y;
},
isBelow: function(point) {
return this.y < point.y;
}
};
Point
类是我们的基类,表示x和y坐标。 Point3D
类继承自Point
并具有z坐标(忽略任何数学不准确性)。
function Point3D(x, y, z) {
Point.call(this, x, y);
this.z = z;
}
Point3D.prototype = new Point(0, 0);
Point3D.prototype.constructor = Point3D;
Point3D.prototype.isAbove = function(point) {
return Point.prototype.isAbove.call(this, point);
};
Point3d.prototype.isDiagonal = function(point) {
return Point.prototype.isAbove.call(this, point)
&& this.x > point.x;
};
在isDiagonal
方法中,我们在Point类上调用isAbove
方法,即使Point3D实现了自己的版本。
调用重写方法
您可以使用此基本模板在任何类上调用任何重写方法:
ClassName.prototype.method.call(this, arg1, arg2, ... argN);