ES6中对类的引用丢失了

时间:2017-03-30 00:00:36

标签: javascript ecmascript-6 class-reference

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

2 个答案:

答案 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,其中thisnew 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的属性值。