节点JS,静态函数/variables最佳实践

我有一个Java背景,我正在试图build立一个节点的JS库。 我有这样的Java类,

public class MyClass { static List<String> myList = initMyList(); private String something; public MyClass(String something) { validate(something); this.something = something; } public static String doSomething(String something) { return doSomethingWithMyList(something); } public String doSomething() { return doSomething(something); } private static String doSomethingWithMyList (String something) { // do something with list .. return something } } 

正如你所看到的,它有一个静态的辅助方法static String doSomething需要String param和非静态函数String doSomething使用实例variables, something

所以用户可以做MyClass.doSomething(string)MyClass m = new MyClass(sting); m.doSomething() MyClass m = new MyClass(sting); m.doSomething() 。 前者不会进行validation,但后者将在构造函数中进行validation。

我想要在节点JS中做到这一点。 我有这个。

 // construction function function MyClass(something) { validate(something); this.something = something; } // static variable MyClass.myList = someModule.getList(); // static function MyClass.doSomething = function doSomething (something) { return something; }; // private static MyClass._doSeomthingWithMyList = function _doSeomthingWithMyList (something) { // do something wiht list return something; }; MyClass.prototype.doSomething = function doSomething() { MyClass.doSomething(this.something); }; module.export = MyClass; 

因为我是Node JS世界的新手,我想确保这是用静态和非静态方法实现类的正确方法。

因为我是Node JS世界的新手,我想确保这是用静态和非静态方法实现类的正确方法。

首先,请记住,即使在ES2015(ES6)及更高版本中,JavaScript中也没有类。 JavaScript使用原型inheritance,而class关键字只是原型的语法糖,而不是类。 Java也没有使用静态types系统来实现它们的私有和公共属性。

在JavaScript中有一个真正的私有variables,你可以像这样使用闭包:

 let f = (x => () => x++)(0); 

这里的f()函数有一个真正的私有variables,没有其他人可以访问,并且在f()所有调用中共享,所以每次调用它都会增加计数器,但是你无法访问任何计数器除了使用f()函数之外的其他方法。

请记住,JavaScript中没有类,而是被称为原型的OOinheritance的新forms(最初出现在Self语言中),有一个误导性的class关键字,可以使用以下语法更容易地定义原型:

 class Polygon { constructor(height, width) { this.name = 'Polygon'; this.height = height; this.width = width; } static distance(a, b) { const dx = ax - bx; const dy = ay - by; return Math.sqrt(dx*dx + dy*dy); } } class Square extends Polygon { constructor(length) { super(length, length); this.name = 'Square'; } } 

看到:

我的build议是,当你学习JavaScript的面向对象特性时,假装你不了解Java,因为它们可能看起来很相似,但实际上它们是完全不同的。

实际上JavaScript更像是类似Java的语法的Scheme,自我风格的OOP加上基于事件循环的asynchronous非阻塞I / O。 这实际上没有像Java。 顺便说一句,与Java不同,它有真正的 lambdaexpression式来实现词法closures,所以你也需要牢记这一点。