ES6中的super.method上下文处理

时间:2016-08-31 16:08:09

标签: javascript ecmascript-6 this super

由于Javascript中还没有私有方法支持,我通常只是在类体外声明一个普通函数并提供this作为参数:

class Foo {
    constructor() {
        _doPrivateStuff(this);
    }
}

function _doPrivateStuff(that) {
    that.bar() // private stuff
}

export default Foo;

但我怎么能以这种方式接受超级方法?

function _doPrivateStuff(that) {
    super.method(); // error, 'super' outside of function or class
}

除此之外,是否有一个的原因我不应该使用这样的“私人”功能?

顺便说一下,我只在Babel上尝试过此操作,并且使用_doPrivateStuff.bind(this)()代替使用that无效

1 个答案:

答案 0 :(得分:5)

super仅适用于类本身,因为要使super起作用,该类需要知道Foo,因此它可以执行(简化)Object.getPrototypeOf(Foo).prototype.method.call(this)来调用父类method。当您只有一个独立的功能时,课程无法知道如何拨打super

要做你想做的事,你必须做

class Foo {
    constructor() {
        _doPrivateStuff(this, () => super.bar());
    }
}

function _doPrivateStuff(that, superBar) {
    superBar();
}

要使用反例进行扩展,如果你有一层额外的课程怎么办?

class Base {
    method(){ console.log('base'); }
}
class Mid extends Base {
    method(){ console.log('mid'); }

    run(){ doPrivateThing(this); }
}

class Child extends Mid {}

new Child();

function doPrivateThing(that){
    // super.method();
}

如果您的示例确实有效,那么您已经doPrivateThing传递了Child的实例,它无法知道它是从Mid内部调用的,如果它已记录midbase?没有足够的信息可以知道。