我尝试向课程添加额外的方法,这些额外的方法应该使用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
),然后将这些方法添加到原始类中?
答案 0 :(得分:5)
super
指的是定义方法的类的祖先,它不是动态的。正如Babel output说明的那样,super
被硬编码为Object.getPrototypeOf(X.prototype)
,因此像这样的孤儿类没有意义,因为它没有{{1} }}:
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;
被指定为原型方法。
答案 1 :(得分:1)
虽然我认为这可以假设为反模式,但您不应该在super
之外使用class
。
您可以使用Object Literals
实现此目的。
const A = {
sayHello() {
console.log("I am A");
},
Factory() {
return Object.create(this);
}
}
const B = {
sayHello() {
super.sayHello();
}
}
Object.setPrototypeOf(B, A);
const c = B.Factory();
c.sayHello();

答案 2 :(得分:-2)
如果你没有让类X继承自B类或A类,那么调用该方法的唯一方法是A.prototype.doSomething()
或更普遍的A.prototype.doSomething.call(this_substitute, ...args)
。