traceur中另一个class的参考方法

Reference methods from another class in traceur

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

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

这是我的代码:

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

在classB中,构造函数运行时:

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

您实际上是将 B 的方法 myMethod 设置为 A。当 A 的构造函数运行时,

this.myMethod,设置为A的anotherMethod。现在,如果您尝试在 B 的构造函数中打印 this.a,您将得到 name : A。这实际上是在引用 class A.

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

简而言之,您只是将函数分配给 A 而没有设置上下文。

您可以使用以下方法强制 fat arrow

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

     myMethod = () => {
            console.log(this);
     }
}

现在您将获得所需的输出。但不幸的是 traceur 不支持它。只有 babel 支持 fat arrow 内部函数,它是 ES7 stage 0 Class Properties.

的一部分

正如 Felix King 所建议的:使用 bind 绑定上下文目前已经足够了

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

     myMethod() {
            console.log(this);
     }
}