Как мне обратиться к содержащему классу из статического метода, когда «this» уже занято вызывающим объектом? - PullRequest
0 голосов
/ 26 января 2019

Используя ES6 / ES2015 и веб-пакет, я пытаюсь обернуть голову вокруг маленького монстра с ключевым словом this .

У меня есть класс Edit, содержащий статический методchange(event) и в рамках этого метода я пытаюсь сделать рекурсивный вызов самого метода (в зависимости от заданной переменной).

В большинстве случаев я мог бы просто вызвать this.change(event), но здесь ключевое слово this уже занято объектом jquery, который вызывал функцию вместо содержащего класса.

Самым простым решением было бы просто позвонить Edit.change(event), но должно быть более чистое решение.Каждый язык программирования, с которым я сталкивался до сих пор, имел некоторую ссылку на встроенный класс.

Я обещаю, что проверил документы и другие потоки в stackoverflow, но, похоже, никто из найденных мной не решает эту конкретную проблему.

// main.js
'use strict';

const $ = require('jquery');
const Edit = require('./Edit');

$(document).ready(() => {
    let thingsToAddToData = {
        whatToDo: // defined here depending on context
        someVariable: //defined here depending on context
        };
    $('table :input').change(thingsToAddToData, Edit.change);
}

и здесь определяется класс редактирования

// Edit.js
class Edit {

    static change(event) {
        if(event.data.whatToDo === 'do_nothing'){
            return false;
        }
        if(event.data.whatToDo === 'do_this_important_thing'){
            // here some important stuff is done
            return true;
        }

        if(event.data.someVariable === 'special_case'){
            event.data.whatToDo = 'do_this_important_thing'

            // THIS IS THE LINE THAT GIVES ME HEADACHES
            return this.change(event);
        }
        // here some default stuff is done
    }
}

module.exports = Edit;

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Самым простым решением было бы просто позвонить Edit.change(event) вместо этого, но должно быть более чистое решение

Нет, это действительно то, что вам нужно использовать, чтобы всегда ссылаться наEdit класс.В этом нет ничего грязного, просто используйте его.

Вы также можете использовать this.change(event), если вы не использовали метод в качестве обработчика событий.Обязательно вызовите его как метод:

$('table :input').change(thingsToAddToData, Edit.change.bind(Edit));
// or
$('table :input').change(thingsToAddToData, e => Edit.change(e));
0 голосов
/ 26 января 2019

Любой из ответов @Bergi должен работать (с использованием Function.prototype.bind или () => {}). Однако я думаю, что ваша проблема носит более структурный характер. Поскольку Edit.change является обработчиком событий, нет смысла вызывать его напрямую, поскольку предполагается, что он запускается через события.

Я бы предложил снова запустить событие с некоторыми изменениями параметров (http://api.jquery.com/trigger/):

заменить Edit.change(event); на this.trigger(event);

Таким образом, нет необходимости напрямую вызывать обработчик, и вам не нужно изменять контекст this, что делает код более прозрачным.

0 голосов
/ 26 января 2019

Статические методы работают с классом, а не с экземплярами класса, они вызываются для класса. Есть два способа вызова статических методов:

<ClassName>.methodName() 

или

<class-instance>.constructor.methodName() 

В статических методах ключевое слово this ссылается на класс. С помощью этого вы можете вызывать статический метод из другого статического метода в том же классе.

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