Вызовите все методы в классе, когда создается экземпляр - PullRequest
0 голосов
/ 22 февраля 2020

Допустим, у меня есть класс, который выглядит следующим образом

class Foo {
  bar() {
    console.log('bar');
  }

  baz() {
    console.log('baz');
  }

  // other methods...
}

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

В настоящее время я делаю это, вызывая каждый метод в классе constructor method

class Foo {
  constructor() {
    this.bar();
    this.baz();
    // other methods
  }

  bar() {
    console.log('bar');
  }

  baz() {
    console.log('baz');
  }

  // other methods...
}

Вот фрагмент этого

class Foo {
  constructor() {
    this.bar();
    this.baz();
    // other methods
  }

  bar() {
    console.log('bar');
  }

  baz() {
    console.log('baz');
  }

  // other methods...
}

new Foo();

Есть ли лучший способ сделать это?

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

Вот как то так

class Foo {
  bar = (() => {
    console.log('bar');
  })()

  baz = (() => {
    console.log('baz');
  })()
}

new Foo();

и он хорошо работает на Chrome, но большинство других браузеров пока не поддерживают для classProperties, так как они были добавлены в ES9

Мой вопрос:

Если у меня есть класс с несколькими методами, могу ли я вызывать их все, когда создается новый экземпляр этого класса, не вызывая каждый индивидуальный метод в constructor методе этого класса?

В контексте этого вопроса вы можете полностью игнорировать необходимость передачи параметров в методы. Мне не нужно передавать какие-либо параметры в любой из методов класса.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Вы можете объявить функцию следующим образом:

bar = function() {
  console.log('bar');
};

Итерировать значения нового экземпляра, проверять функции и вызывать их:

class Foo {
  constructor() {
    Object.values(this).forEach(value => {
      if (typeof value === 'function') {
        value();
      }
    });
  }

  nonFunctionProp = 'nfp';

  bar = function() {
    console.log('bar');
  };

  baz = function() {
    console.log('baz');
  };

  // other methods...
}

new Foo();
0 голосов
/ 22 февраля 2020

Если порядок вызова методов не важен, вы можете динамически перебирать свойства созданного вами экземпляра с помощью метода Object.getOwnPropertyNames:

class Foo {
  constructor() {
    return Object.getOwnPropertyNames (Object.getPrototypeOf (this))
        .filter(propName => (propName !== 'constructor' && typeof this[propName] === 'function'))
        .forEach(propName => this[propName]());
  }

  bar() {
    console.log('bar');
  }

  baz() {
    console.log('baz');
  }

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