2017-03-03 6 views
2

私はJavaの背景を持って、私はノードJSのlibを構築しようとしています。 私はこのように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 
    } 
} 

あなたが見ることができるように、それはString doSomethingは、インスタンス変数、somethingを使用して文字列のparamと非静的関数を取るstatic String doSomething静的ヘルパーメソッドを持っています。

ユーザーはMyClass.doSomething(string)またはMyClass m = new MyClass(sting); m.doSomething()のいずれかを実行できます。前者は検証を行いませんが、後でコンストラクタで検証を行います。

ノードJSでこれを行いたいです。そして私はこれを持っています。

私はNode JSの世界が新しく、静的メソッドと非静的メソッドを持つクラスを実装する方法が正しいことを確認したいと思います。

+0

node.jsの最新バージョンでは、['class keyword'](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

私はNode JSの世界が新しいので、静的メソッドと非静的メソッドでクラスを実装する方法が正しいことを確認したいと思います。

まず、JavaScriptにはES2015(ES6)以降のクラスではないことに注意してください。 JavaScriptはプロトタイプの継承を使用し、classというキーワードは、クラスではなくプロトタイプの構文シュガーにすぎません。また、Javaは静的型システムを使用してそれらを実装しているという意味で、プライベートおよびパブリックプロパティはありません。 f()機能は誰もがアクセス権を持っていないし、それがf()のすべての呼び出しの間で共有され、真にプライベート変数を持っている。ここ

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

:あなたはこのようなクロージャを使用して、真にプライベート変数を持っているために、JavaScriptで

カウンタがインクリメントされるたびに、f()関数を使用する以外の方法でカウンタにアクセスする方法はありません。

JavaScriptにはクラスはありませんが、プロトタイプ(Self言語ではじめて登場したもの)という新しいタイプのOO継承があることに注意してください。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'; 
    } 
} 

参照してください:

彼らは同じように見えるかもしれないが、彼らは実際には非常に異なっているので、私のアドバイスは、JavaScriptのオブジェクト指向の性質を学ぶ際には、Javaを知らないことをふりをするだろう。

実際、JavaScriptは、Java形式の構文、セルフスタイルのOOPプラスイベントループベースの非同期非ブロッキングI/Oを持つSchemeによく似ています。文字通りJavaのようなものではありません。ところで、Javaとは異なり、字句のクロージャを実装するラムダを持っているので、そのことを覚えておく必要があります。

関連する問題