在JavaScript中调用继承的父方法时返回正确的子类型

时间:2017-07-21 21:33:52

标签: javascript oop inheritance

假设我将此父类Vector2定义如下:

function Vector2 (x, y) {
  this.x = x;
  this.y = y;
}
Vector2.prototype.add = function(vec) {
  console.log(Reflect.getPrototypeOf(this));
  if (vec instanceof Vector2)
    return new Vector2(this.x + vec.x, this.y + vec.y);
  throw "This operation can only be performed on another Vector2. Recieved " + typeof vec;
};

Vector2的{​​{1}}扩展名,应该继承其父级的所有功能,并具有将Sizex引用为{{1}的附加功能和y分别如此:

w

最后,我有一个代码段,它创建了两个h的新实例,将它们添加到一起,并尝试从function Size(x,y) { this.x = x; this.y = y; } Size.prototype = new Vector2; Size.prototype.constructor = Size; Size.prototype._super = Vector2.prototype; Object.defineProperties(Size.prototype, { 'w': { get: function() { return this.x; }, set: function(w) { this.x = w; } }, 'h': { get: function() { return this.y; }, set: function(h) { this.y = h; } } }); 属性中读取:

Size

如何修改w的{​​{1}}方法来创建当前类的而不是通用类的新实例?

2 个答案:

答案 0 :(得分:2)

我相信这可能是你正在寻找的东西。

return new vec.constructor(this.x + vec.x, this.y + vec.y);

使用传递给add方法的constructor来创建返回的对象。

您还错误地将this传递给new Vector2( this, ... )

答案 1 :(得分:2)

您的getter代码中存在错误:您需要使用self而不是this

然后你可以用:

调用正确的构造函数
return new this.constructor(this.x + vec.x, this.y + vec.y);

注意:你也可以使用vec.constructor,这完全取决于你将一个Size对象添加到Vector对象时想要发生的事情。对我来说似乎更直观的是,源对象(应用了add方法)确定了返回对象的类。如果您认为添加的对象应该确定返回的对象的类,则使用vec而不是this