Почему JavaScript bind () не работает здесь, как я ожидал? - PullRequest
0 голосов
/ 06 апреля 2020
class Test {
    DISPATCH_TABLE = {
        "Outer Method": this.outerMethod
    }
    innerMethod() {
        console.log("success");
    }
    outerMethod() {
        console.log(this);
        this.innerMethod();
    }
    dispatch(method_name) {
        this.DISPATCH_TABLE[method_name]()
    }
    constructor() {
        this.outerMethod = this.outerMethod.bind(this)
    }
}
t = new Test()
t.dispatch("Outer Method")

Это регистрирует саму таблицу диспетчеризации, а затем печатает ошибку "this.innerMethod не является функцией". Я понимаю, почему этот будет привязан к таблице диспетчеризации без вызова bind () в конструкторе, но я подумал, что включение этого вызова должно было вызвать этот чтобы ссылаться на класс в любых вызовах связанного метода.

Я не виню JavaScript или bind () за мои ожидания. Я просто не знаю, почему мои ожидания неверны.

Я мог бы просто использовать оператор switch вместо таблицы диспетчеризации, но я бы предпочел использовать таблицу диспетчеризации, если смогу.

1 Ответ

2 голосов
/ 06 апреля 2020

Вы, вероятно, лучше проведете время, используя функции стрелок, которые всегда правильно привязаны к этой границе.

Я позволил себе изменить таблицу диспетчеризации, чтобы сопоставить "подробные имена" функций с внутренними именами методов.

class Test {
  DISPATCH_TABLE = {
    "Outer Method": "outerMethod",
  };
  innerMethod = () => {
    console.log("success");
  };
  outerMethod = () => {
    console.log(this);
    this.innerMethod();
  };
  dispatch(method_name) {
    const meth = this[this.DISPATCH_TABLE[method_name]];
    if (!meth) throw new Error(`no such method ${meth}`);
    return meth();
  }
}
t = new Test();
t.dispatch("Outer Method");
...