6

在 C# 中,我们有关于抽象方法的概念,以及如何在 Javascript 中应用它。例子,我有一个例子:

function BaseClass() {
    this.hello = function() {
        this.talk();
    }
    this.talk = function() {
        alert("I'm BaseClass");
    }
};

function MyClass() {
    this.talk = function() {
        alert("I'm MyClass");
    }
    BaseClass.call(this);
};

MyClass.prototype = new BaseClass();

var a = new MyClass();
a.hello();​

当对象是 MyClass 的实例时,BaseClass 中的函数 hello() 如何从 MyClass 调用函数 do()。警报结果必须是“我是我的班级”。请帮我。谢谢。

4

3 回答 3

7

您可能想先调用“Base”构造函数:

function MyClass() {
    BaseClass.call(this);
    this.talk = function() {
        alert("I'm MyClass");
    }
}

否则BaseClass.talk会覆盖MyClass.talk.

附带说明一下,在 javascript 中使用“类”的概念会适得其反,因为这不是这种语言的工作方式。JS 使用原型继承,也就是说,您从其他对象而不是“类”派生新对象。此外,JS 中的每个函数在 C++ 意义上都是“虚拟的”,因为它的this指针取决于函数的调用方式,而不是函数的定义位置。

于 2012-06-19T08:09:11.560 回答
4

你正在通过做覆盖你的功能BaseClass.call(this);

function MyClass() {
    //BaseClass.call(this); // Not really necessary unless you run code inside your base class
    this.talk = function() {
        alert("I'm MyClass");
    }
};

这将使您的代码工作。MyClass.prototype = new BaseClass();应该使 hello 函数在您的对象a上可用。

于 2012-06-19T08:09:25.870 回答
4

问题是您实际上是在 theMyClassBaseClass构造函数中定义私有实例方法。这会覆盖原型方法查找,因为talk方法不在原型中,而是实际的实例属性,并且在构造函数之后BaseClass调用构造函数,从而覆盖属性。MyClasstalk

使用实际原型继承进行演示。

于 2012-06-19T08:10:12.287 回答