我正在使用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
答案 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