gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:32:55 25 4
gpt4 key购买 nike

假设我有这个父类 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 的扩展称为 Size,它应该继承其父级的所有功能优势,并具有引用 xy 分别为 wh,如下所示:

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 属性中读取:

var s1 = new Size(2, 4);
var s2 = new Size(3, 7);
var s3 = s1.add(s2);
console.log(s3.w);
// 'undefined' because s3 is an instance Vector2, not Size

如何修改 Vector2add 方法来创建 whatever 当前类的新实例而不是通用类?

最佳答案

您的 getter 代码中有一个错误:您需要使用 this 而不是 self

然后你可以调用正确的构造函数:

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

注意:您也可以使用 vec.constructor,这完全取决于您将 Size 对象添加到 Vector 对象时希望发生的情况。源对象(应用 add 方法)确定返回对象的类,这对我来说似乎更直观。如果您觉得添加的对象应该确定返回对象的类,请使用 vec 而不是 this

关于javascript - 在 JavaScript 中调用继承的父方法时返回正确的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45247026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com