在js.class中,是否可以从超类中调用其他函数

时间:2013-12-26 13:12:57

标签: javascript oop js.class

我正在使用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中使用?!

2 个答案:

答案 0 :(得分:1)

如果您知道js.classA的内容,则可以在没有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属性提供默认实例方法和属性。

我们来看两个示例类PointPoint3D

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);