Каков хороший способ автоматического связывания методов класса JS? - PullRequest
1 голос
/ 08 июня 2019

Я устал от написания такого кода:

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));

Ответы [ 2 ]

4 голосов
/ 08 июня 2019

Использование жирная стрелка функция в ES6

anotherOne = ()=> {
...
}

Звоните вот так onClick={this.anotherOne}; не нужно связываться в конструкторе

Из спецификации ECMA

Любая ссылка на аргументы, super, this или new.target внутри ArrowFunction должна разрешать привязку в лексической оболочке среда. Обычно это будет функциональная среда немедленно включающая функция.

1 голос
/ 08 июня 2019

Вы можете использовать функцию стрелки ES6:

method = () => {
    //Do stuff
}

Как указано в документах :

Выражение функции стрелки является синтаксически компактной альтернативойк регулярному выражению функции, хотя и без собственных привязок к ключевым словам this, arguments, super или new.target.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...