web-dev-qa-db-ja.com

javascript / nodejsで静的関数/オブジェクトを作成する方法(ES6)

Javascript/Node JSを使用して静的クラスを作成したい。私はグーグルを使用しましたが、役に立つ例が見つかりません。

Javascript ES6で次のようなものを作成したい(C#):

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;
20

JSは クラスベース ではなく プロトタイプベースのプログラミング であることに注意してください。

クラスを複数回作成してそのメソッドにアクセスする代わりに、次のようにオブジェクトにメソッドを作成することができます。

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

MyStaticClass.someMethod(); // Doing someMethod

JSでは、すべてがオブジェクトです( primitive types + undefined + nullを除く)。上記のsomeMethod関数を作成するときと同じように、someMethodオブジェクト内でMyStaticClassを使用してアクセスできる新しい関数オブジェクトを実際に作成しました。 (だからMyStaticClass.someMethod.prototypeMyStaticClass.someMethod.nameなどのsomeMethodオブジェクトのプロパティにアクセスできます)

ただし、クラスを使用する方が便利な場合。 ES6は 静的メソッド で動作するようになりました。

E.g。

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
39
vadi taslim

オブジェクトリテラルを使用します。

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

module.exports = myObject;
4
mattias

staticキーワードを使用して、クラスのメソッドを定義できます

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

console.log(MyStatisticsClass.someMethod());
3
guest271314

私はパーティーに遅れていますが、一つの側面が欠けているようです。

NodeJsは、requireを使用するたびにモジュールコードを実行するわけではありません。これは、モジュールを1回初期化し、requireを使用するたびにこのインスタンスを渡す、一種のステートフルコンテナのようなものです。

私はnodejs noobieですので、より成熟した誰かと議論せずに以下を使用しないでください、しかし、静的メソッドの使用を悪と考えるソフトウェア原則に固執します単に静的メソッドで作成しないでください)。

他の言語では、すべてのモジュールを登録し、依存関係の受け渡しを解決するIoCコンテナーを用意するのが通常の基本です。次に、すべてを「サービス」クラスとして記述します。サービスクラスは、ほとんどの場合、アプリケーションのライフタイムごと、およびコードの1つおきに1回だけインスタンス化されます。これにより、IoCコンテナから同じインスタンスを取得する必要があります。

そのため、IoC :(の快適さなしで、似たようなものを使用します。

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 {}

ご覧のとおり、静的メソッドはありません。インスタンスで動作します(この単純化された例では、インターフェイスでは動作しません)。 Aのコンストラクターは1回だけ呼び出されます。

0
ooouuiii