2016-05-11 6 views
-1

私はこのようなファクトリパターンを使用することができます。作るコンストラクタの引数特権ES5で

function factory(a) { 
    return { 
    say: function() { 
     return console.log(a) 
    } 
    }; 
} 

var instance = factory('hi'); 
instance.say(); // => 'hi' 
instance.a; // => 'undefined' 

それはへの特権であるように、工場出荷時に渡される引数は、それが作成するオブジェクトに設定されていませんすべてのメソッド定義は作成者に公開されていません。

私はこの工場をES6クラスにしたいのですが、どのようにして同じ方法でコンストラクタパラメータを表示できますか?

let hack; 

class Blah { 
    constructor(a) { 
    //bad! 
    this.a = a; 
    //but even worse? 
    hack = a; 
    //instance method is not a class method 
    this.yell =() => console.log(a); 
    } 
    say() { 
    console.log(hack); 
    } 
} 

let blah = new Blah('hi'); 
blah.a; // => 'hi' 
blah.hack; // => 'undefined' 
blah.say(); // => 'hi' 
blah.yell(); // => 'hi' 
+0

[この記事では](http://www.2ality.com/2016/01/private-data-classes.html)にはいくつかの選択肢がありますが、私は基本的にdecezeに同意します。あまりにも心配です。 :Pたとえば、Pythonにはprivateメンバーはまったくありません。それは慣習を使うだけで、うまくいっている。 – Amadan

+1

@Amadan Pythonはまさに私の考えを以下に説明しました。 *私たちはすべてここに大人に同意しています、私の秘密に触れてはいけません "*そのような重要な教訓です... – deceze

答えて

4

私は同じように、コンストラクタのパラメータを明らかにすることができますどのようにこの工場ES6クラスを作りたい場合は?

できません。同じ理由で、プロトタイプメソッドからアクセスできるコンストラクター引数を作成することはできません。

ファクトリメソッドは、クラスとはまったく異なります。同じ効果を達成するためにクラスを使用することはできません。それは問題ありません。 にはにする必要があります。

2
this.yell =() => console.log(a); 

これは本質的に現在の工場で行っていることです。特定のインスタンス固有の値で閉じる特定のインスタンスメソッドで新しいオブジェクトを返しています。これを有効にする唯一の本当の方法です。プロトタイプをすべてメソッドに使用する場合はの場合はthisを使用してインスタンス固有の値を格納する必要があります。そうしないと、prototypeのメソッドがその値にアクセスする方法がありません。

IMOの「プライベート」値は、特にそれらを起こさせるために後方に曲げなければならない場合、非常に過大評価されています。最終的には、人間のプログラマが誤って「誰かの秘密に触れて」いらっしゃった状態にならないようにするのに役立ちます。その目的のために、という命名規則がしばしば完全に十分である。 this.__my_private = a。あなたのものでない限り、__の変数には触れないでください。

+0

100%ack。言語を抱きしめてください。 –

関連する問題