我有以下结构Javacript es5-es6并且控制器类在Get类中丢失了引用,我已经在调查但是我找不到如何避免丢失引用。
class Controller {
constructor() {
this.name = 'Test';
}
test() {
console.log(1, this.name);
}
}
referenceController = new Controller();
// working reference: console.log(1, 'Test');
referenceController.test();
class Get {
method() {
return {
controller: referenceController.test
}
}
}
// Lost self reference: console.log(1, undefined)
new Get().method().controller()
答案 0 :(得分:4)
在本节中,您将测试函数添加为返回对象的属性。
{
controller: referenceController.test
}
然后,当您将其作为该对象的方法(method().controller()
)调用时,this
引用该对象,并从该对象读取name
属性。
您可以绑定上下文以保留引用:
referenceController.test.bind(referenceController)
答案 1 :(得分:0)
您的method
函数返回一个键为controller
的对象,其值不是对Controller
类实例的引用,而是函数引用 this
。
方法的this
上下文将被分配给在调用 时附加到 的对象。
所以new Get().method().controller()
调用方法test
,其中this
是new Get().method()
解析为的值:
{
controller: referenceController.test
}
因此它会退出undefined
class Controller {
constructor() {
this.name = 'Test';
}
test() {
console.log(1, this.name);
}
}
referenceController = new Controller();
// working reference: console.log(1, 'Test');
referenceController.test();
class Get {
method() {
return {
controller: referenceController
}
}
}
// this logs out correctly
new Get().method().controller.test();
上述工作原因是new Get().method().controller
解析为Controller
类实例referenceController 确实具有定义name
的属性值。