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);
}
}
我正在使用 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);
}
}