如果我调用 child.listen(),为什么 Typescript 会从父类中调用被覆盖的子方法?[复制]

Why is Typescript calling an overridden child method from within the parent class if I call child.listen()? [duplicate]

提问人:Loupi 提问时间:7/8/2021 更新时间:7/8/2021 访问量:1067

问:

class Base {

    setupServer(){
        console.log("BaseClass")
    }

    listen() {
        this.setupServer();
    }
}

class Child extends Base {

    setupServer() {
        console.log("ChildClass")
    }
}

const child = new Child();
child.listen();

为什么打印出来:?我希望在类中只能看到同一类中的方法。有没有办法从子实例调用函数,然后仍然先执行类方法,而不在 Child 类中执行?ChildClassthisBasesetupServerlistenBasesetupServer()super.setupServer()

JavaScript TypeScript 继承 这个

评论

5赞 deceze 7/8/2021
这就是继承的运作方式。当前对象 () 只有一个该名称的方法,在子版本中,该方法就是子版本。 引用当前对象,而不是类。thisthis
2赞 ray 7/8/2021
您可以通过 从 Child 调用 Base 的 setupServer 方法,但正如 @deceze 所说,您看到的行为有点像是重写方法的重点。super.setupServer()
0赞 Loupi 7/8/2021
好吧,这是有道理的,但是如果我从 Base 类中删除该方法,编译器会在 listen 方法中抱怨。这是因为编译器不知道子类包含实现吗?setupServer()this.setupServer()
0赞 Tushar Shahi 7/8/2021
@Loupi TS 不能让你这样做,因为这样你就可以从基类本身创建无效的对象。
0赞 deceze 7/8/2021
如果将其从基类中删除,则有可能实例化基类,然后代码会中断。那么它就不是类型安全的了。

答:

0赞 trincot 7/8/2021 #1

即使你对另一个类进行子类化:一个实例只是一个对象,即使基类上的方法对它做一些事情。this

因此,在您的示例中,当类上的方法调用时,仍然是 ,它是 的实例,因此 的分层查找将与 上定义的查找匹配。listenBasethis.setupServer()thischildChildsetupServerChild

0赞 Tushar Shahi 7/8/2021 #2

this在函数中取决于它的执行方式。这里它是在子实例上执行的,因此将调用子实例的方法。setupServer

关于为什么从基类中删除在 TS 中显示错误的问题:setupServer

class Base {

    listen() {
        this.setupServer();
    }
}

class Child extends Base {

    setupServer() {
        console.log("ChildClass")
    }
}

const child = new Child();
child.listen();

这很简单,在这种情况下,您可以随时从基类创建一个对象,当您调用 .Typescript 不能让你这样做,即使后面在子类中定义了函数。this.listen()setupServer