Как создавать статические функции/объекты в 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 {}
Так что, как видите, статических методов нет. Работает с экземплярами (хотя не с интерфейсами в этом упрощенном примере). Конструктор вызывается только один раз.