traceur中另一个类的引用方法

时间:2015-04-03 04:36:14

标签: ecmascript-6 traceur

我正在使用traceur测试ES6中的类,但它没有像我预期的那样工作。

我试图在另一个类中使用一个方法作为引用但是当它被调用时,我在读取this的值时得到调用者类的引用。

这是我的代码:

class A {
    constructor(anotherMethod){
        this.anotherMethod = anotherMethod;
        this.name = "A";
    }
    myMethod (){
        console.log(this.name);
        this.anotherMethod();
    }
}

class B {
    constructor(){
        this.a = new A(this.myMethod);
        this.name = "B";
    }
    myMethod(){
        console.log(this.name);
    }
}

var c = new B();
c.a.myMethod();

我的预期日志是:

A
B

但它显示:

A
A

1 个答案:

答案 0 :(得分:2)

在B类中,当构造函数运行时:

this.a = new A(this.myMethod);

您实际上将B的方法myMethod设置为A.当A&#39的构造函数运行时,

this.myMethod,设置为A的另一个方法。现在,如果您尝试在B&#39的构造函数中打印this.a,您将获得name : A。这实际上引用了A类。

现在,当您尝试执行方法c.a.myMethod()时,由于A包含对class A的引用,它正在调用A的myMethod。在此方法中,{{ 1}}将引用当前执行上下文对象,即A.这就是您在两个控制台中看到this的原因。

简而言之,您只是将功能分配给A而不是设置上下文。

您可以使用以下方式强制A

fat arrow

现在您将获得所需的输出。但不幸的是class B { constructor(){ this.a = new A(this.myMethod); this.name = "B"; } myMethod = () => { console.log(this); } } 并不支持它。只有babel支持traceur内部fat arrow内部函数。

根据Felix King的建议:使用ES7 stage 0 Class Properties绑定上下文目前绰绰有余

bind