3

我有以下结构 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() 
4

2 回答 2

7

在本节中,您将添加测试函数作为返回对象的属性。

{
    controller: referenceController.test
}

然后,当您将其作为方法调用时,该对象 ( method().controller())this引用该对象,并name从该对象中读取该属性。

您可以绑定上下文以保留引用:

referenceController.test.bind(referenceController)
于 2017-03-30T00:08:20.957 回答
0

您的method函数返回一个带有键的对象,controller其值不是对实例的引用,Controller而是一个引用的函数this

方法的this上下文将分配给它被调用时附加到的对象。

所以new Get().method().controller()

调用testwhere is解析this为的值的方法:new Get().method()

{
  controller: referenceController.test
}

因此它注销undefined


修改您的 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
        }
    }
}

// this logs out correctly
new Get().method().controller.test();

上面的工作是因为new Get().method().controller解析到Controller类实例 referenceController确实具有用值定义的属性name

于 2017-03-30T00:44:24.267 回答