あなたのパターンはまったく問題ありません。
ここで、覚えておいていただきたいことがいくつかあります。
主に、最も外側のクロージャーで作成された関数と変数は、他の言語のプライベートな静的メソッド/メンバーのように動作します (構文的に実際に呼び出される方法を除く)。
プロトタイプ パラダイムを使用する場合、private-static メソッド/メンバーを作成することはもちろん不可能です。
外側のスコープに戻す前に、内側のコンストラクターにそれらを追加することで、public-static メンバー/メソッドをさらに作成できます。
var Class = (function () {
var private_static = function () {},
public_static = function () {},
Class = function () {
var private_method = function () { private_static(); };
this.method = function () { private_method(); };
};
Class.static = public_static;
return Class;
}());
Class.static(); // calls `public_static`
var instance = new Class();
instance.method();
// calls instance's `private_method()`, which in turn calls the shared `private_static();`
このように「静的」関数を使用する場合、それらはインスタンスの内部状態にまったくアクセスできないことに注意してください。したがって、それらを使用する場合は、それらに何かを渡す必要があります。それらは必要であり、return ステートメントを収集する (または内部からオブジェクトのプロパティ/配列要素を変更する) 必要があります。
public_static
また、上記のコードが与えられた任意のインスタンスの内部からClass.static();
、パブリック関数を呼び出す完全に有効な方法です。これは、実際には静的ではなく、プロパティとして追加されているクロージャー内の単なる関数であるためです。インスタンスのスコープチェーン内にもある別のオブジェクトの。
追加のボーナスとして:
悪意のあるコード DID が public static メソッド ( Class.static
) を攻撃して内部をハイジャックしようとしても、Class.static
プロパティへの変更は囲まれたpublic_static
関数に影響しないため、内部バージョンを呼び出すことで、インスタンスは引き続きハッキングされます。 -人々をプライベートなものから遠ざける限り安全です...
別のモジュールがインスタンスに依存していて、そのインスタンスのパブリックメソッドが改ざんされていて、他のモジュールが与えられたすべてを信頼した場合... ...まあ、そのモジュールの作成者には残念ですが、少なくともあなたのものは安全です.
クロージャー以上のものを使用して、他の言語の機能を複製する万歳。