Как создавать статические функции/объекты в javascript/nodejs (ES6)

Я хочу создать статический класс, используя Javascript/ Node JS. Я использовал google, но я не могу найти полезный пример.

Я хочу создать в Javascript ES6 что-то вроде этого (С#):

public static MyStaticClass {
   public static void someMethod() {
      //do stuff here
   }
}

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

function MyStaticClass() {
   let someMethod = () => {
      //do some stuff
   }
}
var myInstance = new MyStaticClass();
module.exports = factory;

Ответ 1

Обратите внимание, что JS прототипное программирование вместо class-based.

Вместо того, чтобы создавать класс несколько раз для доступа к его методу, вы можете просто создать метод в объекте, например

var MyStaticClass = {
    someMethod: function () {
        console.log('Doing someMethod');
    }
}

MyStaticClass.someMethod(); // Doing someMethod

Так как в JS все является объектом (кроме примитивных типов + undefined + null). Например, когда вы создаете функцию someMethod выше, вы фактически создали новый объект функции, доступ к которому можно получить с помощью someMethod внутри объекта MyStaticClass. (Вот почему вы можете получить доступ к свойствам объекта someMethod, например MyStaticClass.someMethod.prototype или MyStaticClass.someMethod.name)

Однако, если вам будет удобнее использовать класс. ES6 теперь работает со статическими методами .

например.

MyStaticClass.js

class MyStaticClass {
    static someMethod () {
        console.log('Doing someMethod');
    }

    static anotherMethod () {
        console.log('Doing anotherMethod');
    }
}

module.exports = MyStaticClass;

Main.js

var MyStaticClass = require("./MyStaticClass");

MyStaticClass.someMethod(); // Doing someMethod
MyStaticClass.anotherMethod(); // Doing anotherMethod

Ответ 2

Я бы использовал литерал объекта:

const myObject = {
  someMethod() {
    // do stuff here
  }
}

module.exports = myObject;

Ответ 3

Вы можете использовать ключевое слово static для определения метода для класса

class MyStatisticsClass {
  static someMethod() {
    return "MyStatisticsClass static method"
  }
}

console.log(MyStatisticsClass.someMethod());

Ответ 4

Я опаздываю на вечеринку, но, кажется, отсутствует один аспект.

NodeJs не выполняет код вашего модуля каждый раз, когда вы используете require. Это больше похоже на контейнер с состоянием, который инициализирует ваш модуль один раз и передает этот экземпляр каждый раз, когда вы используете require.

Я - nodejs noobie, так что не используйте следующие без обсуждения с кем-то более зрелым, но я придерживаюсь принципов программного обеспечения, которые считают использование статических методов злыми (например, лучше создавать контракты интерфейса на основе интерфейсов, а не на конкретной реализации интерфейса; вы просто не делайте это статическими методами).

На других языках обычно краеangularьным камнем является наличие некоторого контейнера IoC, в котором зарегистрированы все ваши модули и который решает передачу зависимостей за вас. Тогда вы пишете все как "Сервис" классов. Класс обслуживания создается чаще всего только один раз за время жизни приложения и каждый другой фрагмент кода, для чего требуется, чтобы он получал один и тот же экземпляр из контейнера IoC.

Поэтому я использую что-то похожее, без комфорта IoC :(: Обратите внимание, что в этом примере конструктор вызывается только один раз, хотя требуется 3 раза.

Test.ts:

import {a} from './A';
import {b} from './B';
import {c} from './C';

console.log(c, b);

A.ts:

export class A
{
    constructor(){
        console.log('"A" constructor called');
    }

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

export const a = new A();

B.ts:

import {a, A} from './A';

export class B
{
    constructor(a: A)
    {
        console.log('"B" constructor called, got a:', a);
        a.foo();
    }
}

export const b = new B(a);

C.ts:

//The same as B.ts

Результат:

node test.js

"A" constructor called
"B" constructor called, got a: A {}
foo
"C" constructor called, got a: A {}
foo
C {} B {}

Так что, как видите, статических методов нет. Работает с экземплярами (хотя не с интерфейсами в этом упрощенном примере). Конструктор вызывается только один раз.