gpt4 book ai didi

javascript - 如何在子类同名方法中调用父类方法?

转载 作者:行者123 更新时间:2023-12-02 23:45:02 39 4
gpt4 key购买 nike

我正在尝试使用 ES6 中的类语法创建一个简单的继承结构。我有一个带有方法的父类,例如 update() ,以及一个也需要 update() 方法的子类。我希望调用 child.update() 来包含对 parent.update() 的调用,并包含一些特定于子类的附加功能。

我发现在子类中创建此方法似乎会覆盖父类中对该方法的引用,这意味着我无法同时调用这两个方法。

这是一个例子:

class Xmover {
constructor(x, speedX) {
this.x = x;
this.speedX = speedX;
}

update() {
this.x += this.speedX;
}
}

class XYmover extends Xmover {
constructor(x, y, speedX, speedY) {
super(x, speedX);
this.y = y;
this.speedY = speedY;
}

update() {
this.y += this.speedY;
// *** I would like this to also update the x position with a call
// to Xmover.update() so I don't have to repeat the code ***
}
}

testXY = new XYmover(0, 0, 10, 10);
console.log(`Start pos: ${textXY.x}, ${testXY.y}`);
testXY.update();
console.log(`End pos: ${textXY.x}, ${testXY.y}`);

这会产生输出:

Start pos: 0, 0
End pos: 0, 10

如您所见,通过调用 XYmover.update() 可以正确更新 y 位置,但此新定义会覆盖对 Xmover.update() 的所有调用>。如果两个函数都被调用,我们预计会看到结束位置 10, 10

我见过不使用此类语法的人通过以类似于以下方式创建原始 super 函数的副本来解决此问题:

var super_update = this.update;
update() {
// ... other functionality
super_update();
}

但是,这对我来说并不理想,而且它也不适用于类语法(除非您在子类构造函数中定义此 super_update ,这似乎会创建在子对象的每个实例中拥有 parent.update() 函数的完整副本的其他问题)。

我是 Javascript 新手,所以我还没有完全了解使用原型(prototype)的机制 - 也许最好的解决方案以某种方式涉及这些?然而,在我的理解水平上,它们的工作方式类似,因为即使定义了原型(prototype)函数,创建具有该名称的函数也意味着原型(prototype)永远不会被调用。

最佳答案

 super.update();

这不是super ?这将在父类(super class)中查找 update 函数,并使用正确的 this 调用它。

关于javascript - 如何在子类同名方法中调用父类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55891420/

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