ES6使用`super`出类定义

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在原始类定义之外定义方法(引用),并将这些方法稍后添加到原始类中?

Est*_*ask 6

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被指定为原型方法.