如何将“ this”引用设置为预期的类?

时间:2018-10-29 16:55:37

标签: javascript

我在全局范围内的课堂之外拥有此功能。

function toggleDescriptor(key, descriptors = 0){
    let _a, _b, _c;
    if (descriptors) [_a, _b, _c] = descriptors;
    else [_a, _b, _c] = ["writable", "enumerable", "configurable"];

    if(this[key] == undefined){
        __defprty(this, key, {[_a] : true, [_b] : true, [_c] : true});
    }
    else{
        __defprty(this, key, {[_a] : false, [_b] : false, [_c] : false});
    }
}

我在这样的类中称呼它:

class Application {
    constructor(state){
        this.interface = new Interface(this);
        this.interface.state = state;
        toggleDescriptor("interface"); //this not works...
    }

    run(){
        this.interface.state.handle();
    }
}

但是,toggleDescriptor中的this包含window而不是Application类。我猜它总是将this设置为window对象。但我想将此功能保留在外部,以便其他类可以使用它而不必重复使用此功能。那么,如何在toggleDescriptor类中调用Application时指示Application

2 个答案:

答案 0 :(得分:3)

这是绑定,调用,应用程序进入的地方。

他们会保留这个:)

我认为您需要的是toggleDescriptor.call(this, "interface");

在线上有很多很棒的资源,但是非常简短的版本是:

绑定toggleDescriptor.bind(this, "interface")会将this绑定到toggleDescriptor而不调用toggleDescriptor-适用于要引用该函数但不引用该函数的情况称呼它(例如window.addEventListener('click', toggleDescriptor.bind(this, "interface"))

呼叫toggleDescriptor.call(this, "interface")toggleDescriptor作为当前this

呼叫this

应用toggleDescriptor.apply(this, ["interface"])与call类似,但您将参数作为数组传递

而且,正如@@ Alkis Mavridis用户在上面的评论中所提到的,您可以只在this函数中使用toggleDescriptor,而不愿意使用_obj = () => {this}。我虽然有时(很少)在使用箭头功能和bind混合时发现了一些意外的行为-我认为是因为箭头功能以一种我不知道的方式帮助管理范围(this是什么)完全理解。

答案 1 :(得分:2)

您尝试过

const myApp = new Application(); //or however you acuire this object
toggleDescriptor.call(myApp, "interface"); //"this" inside toggleDescriptor will be myApp

有关呼叫功能的详细信息,请参见here

我还认为您根本不需要_obj变量。只需访问此即可。