Выполнение метода на всех экземплярах класса в JS - PullRequest
1 голос
/ 24 апреля 2020

Допустим, у меня есть класс с методом, подобным:

class MyClass {

  importantMethod() {
    ... //any code here 
  }

}

И скажем, у меня есть 10/20 или более экземпляров класса, таких как:

const inst1 = new MyClass();
const inst2 = new MyClass();
const inst3 = new MyClass();
.... //and more instances here

Есть ли способ выполнения importantMethod() в каждом экземпляре более элегантным способом, чем:

inst1.importantMethod()
inst2.importantMethod()
inst3.importantMethod()
.... //and for all the instances

Ответы [ 3 ]

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

Использование forEach

[inst1 , inst2 , inst3].forEach( (item)=> item.importantMethod() ) 
1 голос
/ 24 апреля 2020

Я предполагаю, что вы хотите иметь возможность запускать функцию (в любое время и, возможно, много раз) на всех экземплярах класса, которые существуют в любой данный момент. Вы можете сделать это, имитируя список экземпляров класса "private stati c". Каждый экземпляр добавляется в список при вызове класса constructor, и вы можете предоставить функцию, которая будет перебирать этот список:

let MyClass;
{
    // this is only visible to functions inside the block
    let myClassInstances = [];

    MyClass = class {
      constructor() {
          myClassInstances.push(this);
      }

      importantMethod() {
          console.log(this);
      }
    }

    MyClass.runImportantMethodOnAll = function() {
        myClassInstances.forEach(inst=>inst.importantMethod());
    }
};

Вы можете использовать это как:

let x = new MyClass();
let y = new MyClass();
MyClass.runImportantMethodOnAll();

Нет необходимости прикреплять runImportantMethodOnAll к MyClass. Вы можете хранить его где угодно.

1 голос
/ 24 апреля 2020

Я думаю, что у вас есть 2 варианта:

  1. Если это можно запустить при инициализации и не выдает ошибок, et c и безопасно, вы можете запустить его в конструкторе и, таким образом, каждый раз, когда появляется новый экземпляр, он будет называть это ... Не лучшая практика, но возможная ....

  2. Сделайте что-то вроде

const instances = [];

for (let i=0; i<20; i++) {
  const classInstance = new MyClass();

  classInstance.ImportantFunction();
  instance.push(classInstance);
}

Это также своего рода хак, но это может сделать код немного чище, если у вас много экземпляров ...

Если вам нужно присвоить имя экземпляру, вы можете изменить массив в Пример выше для объекта и фактически помещает каждый экземпляр с именованным ключом в объект, и тогда было бы легче получить доступ к экземплярам.

По крайней мере, насколько я знаю, я не знаком с какими-либо "хуками" "на экземпляре класса, к сожалению.

...