如何在javascript / nodejs中创建静态函数/对象(ES6)

时间:2016-12-06 03:04:36

标签: javascript node.js ecmascript-6 javascript-objects

我想使用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;

5 个答案:

答案 0 :(得分:33)

请注意,JS是prototype-based programming,而不是class-based

您可以在对象中创建方法,而不是多次创建类来访问其方法,例如

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

MyStaticClass.someMethod(); // Doing someMethod

因为在JS中,一切都是对象(primitive types + undefined + null除外)。就像上面创建someMethod函数一样,您实际创建了一个新的函数对象,可以使用someMethod对象内的MyStaticClass进行访问。 (这就是为什么您可以访问someMethodMyStaticClass.someMethod.prototypeMyStaticClass.someMethod.name对象的属性

但是,如果您发现使用课程更方便。 ES6现在适用于static methods

<强> 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

答案 1 :(得分:4)

我会使用对象文字:

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

module.exports = myObject;

答案 2 :(得分:3)

您可以使用static关键字为类定义方法

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

console.log(MyStatisticsClass.someMethod());

答案 3 :(得分:0)

我参加晚会很晚,但似乎缺少一个方面。

NodeJ不会在每次使用require时执行模块代码。它更像是一种有状态容器,该容器一次初始化您的模块,并在每次使用require时传递此实例。

我是nodejs noobie,所以在不与更成熟的人讨论的情况下不要使用以下命令,但是我坚持软件原则,认为使用静态方法是有害的(例如,最好是针对接口构造接口协定,而不是针对具体接口构造接口协定实现;您只是不能简单地使用静态方法来实现它。

在其他语言中,拥有一些IoC容器是通常的基石,该容器已注册了所有模块并为您解决了依赖关系的传递。然后,将所有内容编写为“服务”类。服务类通常在每个应用程序生命周期内以及每个其他代码段中仅实例化一次,这要求它从IoC容器中获取同一实例。

所以我使用了类似的东西,但没有IoC的舒适:(: 在此示例中请注意-A的构造函数仅被调用一次,尽管需要调用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 {}

如您所见-没有静态方法。适用于实例(在此简化示例中,不适用于接口)。 A的构造函数仅调用一次。

答案 4 :(得分:0)

IICE(立即调用的类表达式):

const A = new (class a{Print(){console.log('I Am static function')}});();
A.Print();

// console.log(a);
// **Uncaught ReferenceError: a is not defined at <anonymous>:`enter code here`1:1**
// 'A' Variable is the only reference to the class a, and the only instance of it.

甚至更好的是,一个没有名字的类:

const A = new class {Print(){console.log('I Am static function')}};