ソフトウェア開発モデルとして、モノリシックパターンは多くのオブジェクト指向の言語で広く使用されています。 JavaScriptでは、モノリシックパターンも広く使用されています。ただし、JavaScript言語には独自のオブジェクト指向の方法があるため、従来のオブジェクト指向の言語と一致していますが、実装では依然として異なります。
まず、従来のオブジェクト指向言語のモノマーパターンの定義を見てみましょう。モノマーパターンは、一度だけインスタンス化でき、よく知られているアクセスポイントからアクセスできるクラスです。この定義には、従来のオブジェクト指向言語の特性、つまりクラスとインスタンス化を強調する2つのポイントがあります。したがって、従来のオブジェクト指向言語の場合、モノリシックパターンは、そのクラスとインスタンス化の自然特性に基づいています。つまり、キーワードクラスを使用してクラスを定義します。クラスは新しいキーワードを介してインスタンス化できますが、新しいインスタンスがインスタンス化されるたびに、同じインスタンスが取得されるか、コンストラクターが新しいインスタンスを1回だけ呼び出すことができるようにする必要があります。
JavaScriptのモノマーパターンの定義を見てみましょう。モノマーは、名前空間を分割し、関連する方法と属性のバッチを整理するために使用されるオブジェクトです。インスタンス化できれば、一度しかインスタンス化できません。上記の定義を比較すると、ここでのモノマーの定義は、その本質を、従来のオブジェクト指向言語のクラスではなく、オブジェクトとして定義していることがわかります。これは、JavaScriptの言語がオブジェクトベースであることを示しています。同時に、インスタンス化できれば、これはJavaScriptにモノマーを定義するいくつかの方法があるべきであることを示していることが後で指摘されました。インスタンス化できるインスタンス化する方法は1つ以上あります。つまり、新しいキーワードを使用してモノマーオブジェクトを作成します。ただし、新しいキーワードを使用して作成されたオブジェクトは実際には関数を介してシミュレートおよび定義されているため、この方法はJavaScript自然の特徴ではありません(ES6はクラスキーワードをサポートし始めていますが、ブラウザによってまだ広くサポートされていません)。では、JavaScriptの自然な特徴を使用してモノマーパターンを実装する方法は?
var singleton = {属性1:true、属性2:10、method1:function(){}、method2:function(arg){}}これは、いくつかのプロパティとメソッドを含むオブジェクトシングルトンです。ページに含まれています。このオブジェクトは、JSがロードされたときに作成されます。呼び出し時にSingleton.method1を使用して呼ばれます。そのインスタンス化は、JSの解析を読み込むページの実行中に完了します。このオブジェクトをインスタンス化するために新しいキーワードを使用しません。これは、JavaScriptにモノリシックパターンを実装することと、従来のオブジェクト指向言語の実装との大きな違いです。この方法はよりシンプルで理解しやすいです。ただし、この方法にはいくつかの欠点があります。明らかな欠点の1つは、名前空間を提供しないことです。他のプログラマーもページ内のシングルトン変数を定義している場合、モノリシックオブジェクトを上書きして混乱させるのは簡単です。したがって、この問題については、次のように書き直されます。
var myspace = {}; myspace.singleton = {属性1:true、属性2:10、method1:function(){}、method2:function(arg){}}}ここでは、MySpaceの名前空間が最初に定義され、次にシングルオブジェクトのシングルトンがこのオブジェクトの下に取り付けられ、他のプログラマーとの競合や誤動作の可能性が大幅に減少します。他の人がグローバル範囲でシングルトン変数を定義していても、シングルトンオブジェクトを汚染しません。これは、名前空間を分割し、前の定義で述べたようにいくつかの関連属性と方法を整理する機能を実装します。
この方法にはまだ欠点があります。このモノリシックオブジェクトのすべてのプロパティと方法は共有されており、外部からいつでもアクセスおよび変更できます。したがって、閉鎖は、次のように私有地と方法をシミュレートするために使用されます。
myspace.singleton =(function(){var privateattribute1 = false; var privateattribute1 = [1,2,3]; function privatemethod1(){} function privatemethod2(){} return {publicattribute1:true、publicattribute2:10、publicmethemod1:privateattribute1() publicMethod2:function(arg){privateTtribute1 = [4,5,6]}});ここでは、モノリスオブジェクトに匿名の自己実行関数を直接割り当てます。この関数では、VARおよび関数のキーワードを使用して、それぞれそのプライベートプロパティとメソッドを定義します。関数が実行されると、その内部範囲の空間がリサイクルされるため、これらは関数の外側(モノリスオブジェクトの外側)の外側に直接アクセスすることはできません。そのため、閉鎖を使用して私有地と方法をシミュレートできます。この関数(閉鎖)では、オブジェクトが最終的に返されます。これには、一部のパブリックメソッドとプロパティが含まれています。同時に、これらのパブリック方法は関数内で定義されているため、私的な特性と方法を呼び出すことができます。ただし、外の世界は、返されたパブリック方法とプロパティを通じて特定の操作を完了することができ、Singleton.privatemethod1などのプロパティを直接呼び出すことはできません。これにより、モノリシックオブジェクトが外部の世界を隔離して私的な特性と方法に直接アクセスするだけでなく、特定の操作を完了するために外の世界にいくつかの共通の特性と方法を提供します。
匿名関数の自己解釈によって構築されたこのモノリシックパターンは、多くのJSライブラリで広く使用されていますが、まだ問題があります。ページをロードするときにオブジェクトを使用する必要がなく、オブジェクトの作成がより高価になる場合(多くの計算やDOMツリーとそのプロパティなどへの複数のアクセスなど)、JSの解析と実行で直接作成するのではなく、必要なときに作成することが合理的です。この概念は怠zyなロードと呼ばれるため、次のように上記のコードを変更します。
myspace.singleton =(function(){var inlectinstance; function constructor(){var privateattribute1 = false; var privateattribute1 = [1,2,3]; function privatemethod2(){} function privatemethod2(){} return {publicattribute1:prup、public2:10、public2:10、public privattribute1 = pribattribute1 = [4,5,6]}ここでは、匿名関数で、モノリシックオブジェクトが作成されたかどうかを判断するためのハンドルとして匿名関数で定義されます。次に、モノリシックオブジェクトに対して定義されたすべての属性とメソッドは、コンストラクターと呼ばれる関数に配置されました。関数が呼び出された場合にのみ、モノリシックオブジェクトを作成することができます。そうしないと、直接作成されません。次に、外部呼び出し用のGetInstanceメソッドを含むオブジェクトを返します。メソッドを呼び出すとき、最初にモノリシックオブジェクトが存在するかどうかを判断します。存在する場合は、直接返してください。それ以外の場合は、コンストラクター関数を呼び出してモノリシックオブジェクトを構築して返します。最後に、モノリシックオブジェクトの方法を呼び出す場合、myspace.singleton.getInstance()。publicMethod1()を使用する必要があります。ここでは、この方法を呼び出すときにのみこのモノリシックオブジェクトを作成します。そうしないと、モノリシックオブジェクトは自動的に作成されません。