Увеличивайте переменную количества объектов на единицу каждый раз, когда вызывается/вызывается один из множества методов объекта

#javascript #object

Вопрос:

Допустим, у нас есть следующий объект:

 class Foo{
     constructor(){
          this.count = 0;
     }
     method1() { <does something> }
     method2() { <does something else> }
     method3() { <does something even more> }
}
 

Теперь, очевидно, мы можем добавить следующую строку кода к КАЖДОМУ методу, и счетчик обновится:

 this.count  ;
 

Хотя я знаю, что это всего лишь одна строка кода, можно сказать, что это избыточная строка кода. Итак, есть ли способ определить, был ли вызван метод объекта, независимо от того, какой он, а затем обновить счетчик?

Комментарии:

1. Не могли бы вы рассмотреть возможность добавления ненужного кода, более или менее «избыточного», для простого использования this.count в каждом методе?

2. Это довольно простой пример, иллюстрирующий проблему. Но если бы было больше функций, то это было бы излишним.

Ответ №1:

Вместо этого вы можете выполнить итерацию по отдельному объекту методов, которые нужно добавить, и this.count сначала выполнить их.

 class Foo{
     constructor(){
          this.count = 0;
     }
}
const methods = {
  method1() {
    console.log('m1');
  },
  method2() {
    console.log('m2');
  },
  method3() {
    console.log('m3');
  },
};
for (const [key, value] of Object.entries(methods)) {
  Foo.prototype[key] = function(...args) {
    this.count  ;
    value(...args);
  }
}

const f = new Foo();
f.method1();
f.method1();
f.method2();
console.log(f.count); 

Комментарии:

1. Это классный ответ! Однако младшие программисты должны знать, что вы усложняете отладку в дальнейшем, и, как правило, избегаете подобных вещей, потому что, хотя сейчас это делает написание кода на несколько строк меньше, человеку, который вас заменяет, действительно трудно понять, откуда берется это количество.

2. Это отвратительно, спасибо. И да, я согласен, что это действительно добавляет немного сложности, но, по крайней мере, в моем случае я ни с кем не делюсь кодом. Этот вопрос был задан исключительно для того, чтобы определить, возможно ли это вообще.