@dmitriyivvvv

Переопределение функции после выполнения?

Добрый день! Возник такой вопрос почему таким образом можно переопределить функцию после ее первого вызова:
function foo() {
  console.log('Hello!');
  foo = function () {
    console.log('Bye!');
  };
} 
foo()// Первый вызов 'Hello!', все последующие 'Bye!'

Но если на функцию ссылается объект например:
function foo() {
  console.log('Hello!');
  foo = function () {
    console.log('Bye!');
  };
}
var obj = {
  foo: foo
}
obj.foo();

То переопределения функции не происходит, почему так получается?
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Но если на функцию ссылается объект...

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

Указывайте контекст при переопределении, т.е., замените

foo = function () {

на

this.foo = function () {
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
rockon404
@rockon404
Frontend Developer
Плохое решение. В вашем случае, в объекте лучше хранить состояние или флаг.
var obj = {
  foo() {
    const message = this.isFooCalled ? 'Bye!' : 'Hello!';

    console.log(message);

    if (!this.isFooCalled) {
      this.isFooCalled = true;
    }
  }
}

obj.foo();

Приложения, которые изменяют себя в рантайме вместо того чтобы хранить и использовать состояние, очень плохо дебажатся и поддерживаются.
Ответ написан
meltmestnt
@meltmestnt
У верблюда два горба, потому что жизнь - борьба
Во втором случае методу foo объекта obj присваивается
function () {
  console.log('Hello!');
  foo = function () {
    console.log('Bye!');
  };
}
. При вызове метода foo у объекта obj выполняетя console.log("Hello"), затем сама функция foo ( Не метод объекта! ) меняется на
function () {
    console.log('Bye!');
  };
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы