首页 > 解决方案 > 自动绑定JS类方法的好方法是什么?

问题描述

我厌倦了编写这样的代码:

class Something {

    constructor() {

        this.method = this.method.bind(this);
        this.anotherOne = this.anotherOne.bind(this);
        // ...
    }
}

这很耗时,而且很容易忘记绑定方法。我知道类字段提案,但它仍然是第 3 阶段,似乎有一些问题

我当前的解决方案(基于此答案)如下所示:

class Something {

    constructor() {

        // Get all defined class methods
        const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(this));

        // Bind all methods
        methods
            .filter(method => (method !== 'constructor'))
            .forEach((method) => { this[method] = this[method].bind(this); });
    }
}

这似乎可行,但我想知道是否有更好的方法,或者这种方法是否存在我不知道的问题。

更新:为什么要这样做?

我遇到的问题是,如果我不在构造函数中绑定我的类函数,我必须记住稍后“正确地”调用它们。例如:

const classInstance = new Something();

// This fails for a non-obvious reason
someAction()
    .then(classInstance.method);

// This works of course but looks like we created a useless function if you don't know better
someAction()
    .then(result => classInstance.method(result));

标签: javascriptarraysfunctionobjectecmascript-6

解决方案


在 ES6 中使用胖箭头函数(一般称为箭头函数)

anotherOne = ()=> {
...
}

像这样调用onClick={this.anotherOne};不需要在构造函数中绑定

来自ECMA 规范

对 ArrowFunction 中的参数、super、this 或 new.target 的任何引用都必须解析为词法封闭环境中的绑定。通常,这将是直接封闭函数的函数环境。


推荐阅读