Ada*_*dam 3 javascript class ecmascript-6
我正在尝试向类中添加额外的方法,这些额外的方法应该使用这些super
方法.
如果我在模型定义中添加它们,它就可以工作.
class A {
doSomething() {
console.log('logSomething');
}
}
class B extends A {
doSomething() {
super.doSomething();
console.log('logSomethingElse');
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试添加额外的方法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');
}
Run Code Online (Sandbox Code Playgroud)
很明显,为什么我会收到这个错误.这是一个函数而不是类方法.
让我们尝试将方法定义为类方法,并将其复制到原始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;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我会得到TypeError: (intermediate value).doSomething is not a function
.
有没有办法super
在原始类定义之外定义方法(引用),并将这些方法稍后添加到原始类中?
super
是指定义方法的类的祖先,它不是动态的.正如Babel输出所示,这super
是硬编码的Object.getPrototypeOf(X.prototype)
,因此像这样的孤立类没有意义,因为它没有super
:
class X {
doSomething() {
super.doSomething();
...
}
}
Run Code Online (Sandbox Code Playgroud)
但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;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它将引用类实例的祖先类,其中doSomething
被指定为原型方法.
归档时间: |
|
查看次数: |
624 次 |
最近记录: |