我刚进入JavaScript,我对其面向对象的行为感到困惑。
我只是尝试使用Point2D
,x
成员创建一个班级y
,并使用Point3D
x
班级y
进行扩展, z
个成员。
我试图实现的行为是这样的,让我们在C#中说:
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)
之类的事情,但我不想用固定的 x
,y
坐标和变量来创建原型z
。
它必须非常简单,但我只是没有得到它,我似乎无法调用超类构造函数或使其行为正常。
答案 0 :(得分:16)
JavaScript的原型继承提供了几种不同的灵活方式来执行您正在寻找的那种多态构造函数。在您的特定示例中,您需要以下内容:
function Point2D(x, y) {
this.x = x;
this.y = y;
}
function Point3D(x, y, z) {
Point2D.call(this, x, y);
this.z = z;
}
在constructor
明确设置prototype
时,不一定非常需要。 (实际上,只有在“一次性”创建原型时才有必要 - 例如,使用对象。)
有关面向对象JavaScript的详细讨论,我推荐Nicholas Zakas的 JavaScript中的面向对象编程原理(电子书)或者在他的另一本书中讨论原型和继承, 面向Web开发人员的专业JavaScript 。