2017-08-23 9 views
2

REALプライベートメソッドINSIDE ES6クラスがあります。しかし、私はちょっと遊んでいて、良いことを発見しました。おそらく...情報漏えいのないnodejs専用環境のES6モジュール/クラスで '実際の'プライベートメソッドを定義する

私は、オブジェクトのプロパティを公開しないことはできません。だから私は、クラスをインポートすることができます

class MyClass { 
    constructor() { 
    /** 
    * Initialize stuff... 
    */ 
    } 

    myMethod() { 
    /** 
    * Do public stuff... 
    */ 
    } 

} 

// expose class to environment. 
export default MyClass; 

:の

import MyClass from './MyClass.js';

をしかし、私は、私は別々のファイルに私のクラスを分割し、その後のようなこれらのクラスをエクスポートして、ややOOPプログラミングの達成しようとしましたコースmyMethodは、モジュールをインポートした他のファイルからアクセスできます。今、あなたはプライベート変数とプライベートメソッドにアクセスすることはできません

// private variable outside of class scope but still accessible. 
let possiblePrivateVariable = 'am I a private variable?'; 

class MyClass { 
    constructor() { 
    /** 
    * Initialize stuff... 
    */ 
    } 

    myMethod() { 
    // run private method. 
    console.log(_possiblePrivateMethod()); 
    // show private variable. 
    console.log(possiblePrivateVariable); 
    } 

} 

// private function outside of class scope but still accessible. 
function _possiblePrivateMethod() { 
    return 'am I a private method?'; 
} 

// expose class to environment. 
export default MyClass; 

// Import class to newFile.js and use it. 
import MyClass from './MyClass.js'; 

const exposedClass = new MyClass(); 
exposedClass.possiblePrivateVariable; // -> undefined. 
exposedClass._possiblePrivateMethod(); // -> undefined. 
exposedClass. myMethod();    // -> logs: am I a private method? 
             //   am I a private variable? 

ことがある私は、私はこれを試してみたクラスによってアクセス可能beeingて変数や関数を必要としていたSinced私は彼らに「export」という言葉を公開していないので、それらは「プライベート」のように感じていることが明らかです。私の質問は、このメソッドがプライベート変数とメソッドを作成すると考えられるかどうかです。また、コードを実行しているときに表示された方法で他に漏れが発生する可能性がありますか?

よろしく、 Megajin


追記:それはNodeJSのみの環境であるため、私は、ブラウザのサポートを必要としません。 NodeJS v8.1.4を使用しており、npm startスクリプトにbabelを使用していますので、をTypeErrorなしで使用することができます。

私は、この質問が重複とみなされる可能性があることを認識していますが、この質問はクラス内のプライベートプロパティ、変数、メソッドについてではありません。

+1

まあ、はい、しかし...その "プライベート"変数は、クラスのすべてのインスタンス間で共有されています。潜在的にいくつかの独立したインスタンスを持つクラスを持つという目的を破るものです。あなたはそれを(非)グローバル変数に減らしました。 – deceze

+1

これらはメソッドではなく、インスタンスの一部ではありません。それらは静的な関数であり、モジュールのローカルな変数です。どちらがいいですか、あなたが探していたものではない可能性が最も高いです。 – Bergi

+0

@deceze同じクラスのインスタンスが2つある場合、変数はお互いに上書きされますか? – Megajin

答えて

3

私の質問は、この方法がプライベート の変数とメソッドを作成すると考えられるかどうかです。

はい、ES6/7/8がクラスでプライバシーを処理しないという事実に対処する実際の解決策です。

コードを実行している間に、私が示した方法で他の可能性のあるリークがある場合は、 ? ない漏れ

詳細な回答:

機能のプライベートを作るもの、あなたのプライベート関数のシステムでは、JavaScriptでは関数のスコープは、それが定義されていますどこで定義されていることである高速答えは

。あなたの場合はファイル。

ファイル外に関数をエクスポートしないと、その関数にアクセスする方法はありません。次の主流の例の機能にアクセスすることができないように:

function toto() { 
const tmpToto =() => console.log('Hello'); 

// I can access tmpToto from here 
tmpToto(); 

return false; 
} 

// I cannot access tmpToto from here 

Hereはあなたが解決するだろうどのように

をコメントに応じてスコープ


詳細に関する情報についての素晴らしい説明を取得します複数のクラスインスタンスが が「範囲外」変数を共有するという問題がありますか?

IIFE(Immediately-invoked function expression)は@Son JoungHoの説明のとおりthis postで使用できます。

let Name = (function() { 
    const _privateHello = function() {} 

    class Name { 
    constructor() {} 

    publicMethod() { 
     _privateHello(); 
    } 
    } 

    return Name; 
})(); 
+0

JavaScriptでスコープがどのように機能するのか、私は考えました。複数のクラスインスタンスが「範囲外」変数を共有するという問題をどうやって解決しますか? – Megajin

+1

値を格納し、コンストラクタでこれを管理する配列を持つことができます。 –

+1

ポスト編集 –

関連する問題