10

我刚接触 JavaScript,我对它面向对象的行为感到有点困惑。我只是想用 , 成员创建一个类Point2Dx并用一个有 ,成员的类来扩展y它。我试图实现的行为类似于,让我们在 C# 中说:Point3Dxyz

class Point2D
{ 
   int x, y;
   public Point2D(int x, int y) { this.x = x; this.y = y; }
}
class Point3D : Point2D
{
    int z;
    public Point3D(int x, int y, int z) : base(x, y) { this.z = z; }
}

我读了很多东西,但我似乎并没有真正找到我想要的东西。到目前为止,这是我所做的:

function Point2D(x, y) { this.x = x; this.y = y; }
Point2D.prototype.constructor = Point2D;
function Point3D(x, y, z) { Point2D.prototype.constructor.call(this); this.z = z; }
Point3D.prototype = new A(); // see latter explanation
Point3D.prototype.constructor = B;
var p = new Point3D(10, 20, 30);

这显然是错误的。

现在,我知道我应该做类似的事情,Point3D.prototype = new A(x, y)但我不想创建一个带有固定 xy坐标和变量的原型z。它一定很简单,但我只是不明白,我似乎无法调用超类构造函数或使其行为正常。

4

1 回答 1

17

JavaScript 的原型继承提供了几种不同的灵活方式来执行您正在寻找的多态构造函数。在您的特定示例中,您想要这样的东西:

function Point2D(x, y) {
  this.x = x;
  this.y = y;
}

function Point3D(x, y, z) {
  Point2D.call(this, x, y);
  this.z = z;
}

在这里明确设置constructoron theprototype并不是绝对必要的。(只有在“一次”创建原型时才真正需要——例如,使用对象。)

对于面向对象的 JavaScript 的详细讨论,我推荐 Nicholas Zakas 的JavaScript 中的面向对象编程原理(电子书)或在他的另一本书《面向 Web 开发人员的专业 JavaScript 》中对原型和继承的讨论。

于 2013-01-31T16:07:55.990 回答