2017-03-03 81 views
2

我有一個Java背景,我正在嘗試構建一個Node JS庫。 我有這樣的Java類;節點JS,靜態函數/變量最佳實踐

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需要字符串PARAM和非靜態函數String doSomething使用實例變量,something

所以用戶可以做MyClass.doSomething(string)MyClass m = new MyClass(sting); m.doSomething()。前者不會進行驗證,但後者會在構造函數中進行驗證。

我想在節點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; 

由於我是新的節點JS世界,我想確保這是正確的方式來實現類與靜態和非靜態方法。

+0

在現代版本的node.js中,您可以使用['class關鍵字'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes)來定義類。您不再需要直接操作原型。而且,您可以使用['static'關鍵字](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static)來定義靜態方法。 – jfriend00

回答

1

由於我是新的節點JS世界,我想確保這是正確的方式來實現類與靜態和非靜態方法。

首先,請記住,即使在ES2015(ES6)及更高版本中,JavaScript中也沒有類。 JavaScript使用原型繼承,class關鍵字僅僅是原型的語法糖,而不是類。 Java也沒有使用靜態類型系統來實現它們的私有和公共屬性。

在JavaScript中有你使用閉包這樣一個真正的私有變量:

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

這裏f()功能有一個真正的私有變量,沒有一個人有訪問和它的f()所有調用共享所以每次調用它時都會增加計數器,但除了使用f()函數之外,您無法以任何其他方式訪問計數器。

請記住,JavaScript中沒有類,但是稱爲原型的OO繼承的新形式(最初出現在Self語言中),有一個誤導性名爲class的關鍵字,可讓您使用語法更輕鬆地定義原型像:

class Polygon { 
    constructor(height, width) { 
    this.name = 'Polygon'; 
    this.height = height; 
    this.width = width; 
    } 
    static distance(a, b) { 
    const dx = a.x - b.x; 
    const dy = a.y - b.y; 

    return Math.sqrt(dx*dx + dy*dy); 
    } 
} 

class Square extends Polygon { 
    constructor(length) { 
    super(length, length); 
    this.name = 'Square'; 
    } 
} 

參見:

我的建議是假裝你不知道Java的,當你學習JavaScript的面向對象的性質,因爲它們可能看起來相似,實際上卻是非常不同的。

實際上JavaScript更像是類似Java的語法的Scheme,自我風格的OOP加上基於事件循環的異步非阻塞I/O。這實際上不像Java。順便說一下,與Java不同,它有real實現詞法關閉的lambda表達式,因此您還需要牢記這一點。