Javascript中的虚函数

kho*_*ang 8 javascript oop

我想问一下如何在像C#这样的javascript中实现虚函数

  • 我有一个基础A
  • 我还有一个名为B的派生类
  • A类有一个名为virtualFunction的函数,它应该是一个类似于C#的虚函数,这可以在派生类B中重写
  • 该函数将被调用以在基类的构造函数A中执行.如果在B中重写该函数,则将调用B的一个,否则将调用A的一个.

通过下面的这个例子,我希望得到一个'B'警报,而不是'A'.

function A() {
  this.virtualFunction();
}

A.prototype.virtualFunction = function() {
  alert('A');
};

//-------------------------------------

function B() {}

B.prototype = new A();
B.prototype.virtualFunction = function() {
  alert('B');
};

var b = new B();
Run Code Online (Sandbox Code Playgroud)

如果我们在instanced之后调用函数,就像这样,那么它没关系,但我需要"在构造函数内部"

var b = new B();
b.virtualFunction();
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 7

因此,首先要意识到JavaScript不会使用与C#相同的语义.试图让它这样做会让你心痛; 你最好学习如何在JS中完成工作.事实上,大多数人并没有尝试在JS中做很多继承类型的东西,而是赞成组合(这实际上是我熟悉的所有OO语言中的最佳实践).

也就是说,您可以对代码进行一些改进.

function A() {
  this.virtualFunction();
}

A.prototype.virtualFunction = function() {
  alert('A');
};

//-------------------------------------

function B() {
   A.call(this);
}

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
B.prototype.virtualFunction = function() {
  alert('B');
};

var b = new B();
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用“Object.setPrototypeOf”并放弃“修复”构造函数,因为它不会替换整个原型对象,而只会设置引用。 (2认同)