gpt4 book ai didi

javascript - ES6 在类定义之外使用 `super`

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:58:49 27 4
gpt4 key购买 nike

我正在尝试向类中添加额外的方法,这些额外的方法应该使用 super 方法。

如果我将它们添加到模型定义中,它就会起作用。

class A {
doSomething() {
console.log('logSomething');
}

}

class B extends A {
doSomething() {
super.doSomething();
console.log('logSomethingElse');
}
}

如果我尝试将额外的方法添加到 B.prototype,我将得到 SyntaxError: 'super' keyword unexpected here

class A {
doSomething() {
console.log('logSomething');
}

}

class B extends A {
}

B.prototype.doSomething = function doSomething() {
super.doSomething();
console.log('logSomethingElse');
}

很明显,为什么会出现此错误。这是一个函数而不是类方法。

让我们尝试将方法定义为类方法,并将其复制到原始的 B 类:

class A {
doSomething() {
console.log('logSomething');
}

}

class B extends A {}

class X {
doSomething() {
super.doSomething();
console.log('2 logSomethingElse');
}
}

B.prototype.doSomething = X.prototype.doSomething;

在这种情况下,我会得到 TypeError: (intermediate value).doSomething is not a function

有没有办法在原始类定义之外定义方法(指的是 super),然后将这些方法添加到原始类中?

最佳答案

super 指的是定义方法的类的祖先,它不是动态的。作为Babel output说明了这一点,super 被硬编码为 Object.getPrototypeOf(X.prototype),因此像这样的孤儿类没有意义,因为它没有 super :

class X {
doSomething() {
super.doSomething();
...
}
}

但是 super 可以用动态对应物代替:

doSomething() {
const dynamicSuper = Object.getPrototypeOf(this.constructor.prototype);
// or
// const dynamicSuper = Object.getPrototypeOf(Object.getPrototypeOf(this));
dynamicSuper.doSomething();
...
}

class B extends A {}
B.prototype.doSomething = doSomething;

在这种情况下,它将引用类实例的祖先类,其中 doSomething 被指定为原型(prototype)方法。

关于javascript - ES6 在类定义之外使用 `super`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46806091/

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