オブジェクト指向とは何ですか?オブジェクト指向は一種の考えです! (ナンセンス)。
オブジェクト指向は、プログラム内のすべての主要なモジュールをオブジェクトとして扱うことができ、モジュールには属性とメソッドがあります。このようにして、いくつかのプロパティとメソッドをカプセル化する場合、将来使用するのは非常に便利で、退屈で反復的な作業を避けることもできます。次に、JSでのオブジェクト指向の実装について説明します。
工場モデル
ファクトリーパターンは、ソフトウェアエンジニアリングの分野でよく知られている設計パターンであり、ECMAScriptでクラスを作成できないため、オブジェクトは関数カプセル化で作成されます。実装方法は非常に単純です。つまり、関数にオブジェクトを作成し、オブジェクトに属性とメソッドを割り当ててからオブジェクトを返すことです。
function createblog(name、url){var o = new object(); o.name = name; o.url = url; o.sayurl = function(){alert(this.url); } return o;} var blog1 = createblog( 'wuyuchang'、 '//www.vevb.com/');工場パターンの実装方法は非常に単純であり、複数の類似のオブジェクトを作成する問題を解決しますが、工場パターンは、日付、配列などとは異なり、すべてオブジェクトであるため、オブジェクトのタイプを識別できないため、コンストラクターパターンが表示されます。
コンストラクターモード
ECMAScriptのコンストラクターは、配列や日付などのネイティブJSオブジェクトと同様に、特定のタイプのオブジェクトを作成できます。実装方法は次のとおりです。
function blog(name、url){this.name = name; this.url = url; this.alerturl = function(){alert(this.url); }} var blog = new blog( 'wuyuchang'、 '//www.vevb.com/');console.log(blog instanceof blog); //本当、ブログがブログのインスタンスであるかどうかを判断します。つまり、工場モードができない問題を解決しますこの例は、機能名を除いて工場モデルとは異なり、慎重な子供の靴は多くの違いを見つけるはずです。
関数名の最初の文字は大文字です(標準は、最初の文字が大文字であると厳密に規定していませんが、コンベンションによると、コンストラクターの最初の文字は大文字です。
表示されていないオブジェクトを作成します
このオブジェクトに属性とメソッドを直接割り当てます
返品声明はありません
新しいを使用してオブジェクトを作成します
オブジェクトを認識できるようになります(これは、コンストラクターパターンが工場パターンを上回る場所です)
コンストラクターは使いやすいですが、不利な点がないわけではありません。コンストラクターを使用することの最大の問題は、インスタンスを作成するたびにメソッドを再作成する必要があることです(理論的には、オブジェクトのプロパティはオブジェクトを作成するたびに異なり、オブジェクトのメソッドは同じです)。ただし、まったく同じメソッドを2回作成する必要はないため、オブジェクトの外側に関数を移動できます(一部の子供の靴は不利な点を見たことがあります!)。
function blog(name、url){this.name = name; this.url = url; this.alerturl = alerturl;} function alerturl(){alert(this.url);} var blog = new blog( 'scjb51'、 'http://sc.vevb.com/')、blog2 = new blog( 'jb51'、 '//www.vevb.com/'); blog.alerturl(); // http://sc.vevb.com/blog2.alerturl(); // //www.vevb.com/Alerturlをグローバル関数に設定するため、ブログとブログ2が同じ機能にアクセスしますが、問題は再び発生します。実際にブログのみを使用したい関数は、グローバルな範囲で定義されています。これは、グローバルスコープがその名前に値することを示しています。さらに受け入れられないのは、特定のオブジェクトでのみ使用されるグローバル範囲で多くの方法が定義されていることです。無駄なスペースであるだけでなく、明らかにオブジェクト指向のカプセル化を失うため、この問題はプロトタイプで解決できます。
プロトタイプモード
作成する各関数には、オブジェクトへのポインターであるプロトタイプ属性があり、このオブジェクトの目的は、特定のタイプのすべてのインスタンスで共有できるプロパティとメソッドを含めることです。プロトタイプオブジェクトを使用する利点は、すべてのオブジェクトインスタンスが含まれるプロパティとメソッドを共有できることです。
function blog(){} blog.prototype.name = 'wuyuchang'; blog.prototype.url = 'http://tools.vevb.com/';blog.prototype.friend = [' fr1 '、' fr2 '、' fr3 '、' fr4 '];ブログ= name + name this.friend);} //次のものはテストコードvar blog = new blog()、blog2 = new blog(); blog.alertinfo(); // wuyuchanghttp://tools.vevb.com/fr1,fr2,fr3、fr4blog2.alertinfo(); // wuyuchanghttp://tools.vevb.com/fr1,fr2,fr3,fr4blog.name = 'wyc1'; blog.url = 'http://***.com'; blog.friend.pop(); blog2.name = 'wyc2'; blog2.url = 'http:/++ com'; // wyc1http://***.comfr1,fr2、fr3blog2.alertinfo(); // wyc2http://++.comfr1,fr2、fr3プロトタイプパターンには欠点がないわけではありません。まず、初期化パラメーターを通過するコンストラクターのリンクを省略します。その結果、すべてのインスタンスはデフォルトで同じ属性値を取得しますが、これは非常に不便ですが、これはプロトタイプの最大の問題ではありません。プロトタイプパターンの最大の問題は、共有の性質によって引き起こされます。共有により、1つのインスタンスが参照を変更し、もう1つのインスタンスも参照を変更します。したがって、通常、プロトタイプだけを使用するのではなく、プロトタイプパターンとコンストラクターパターンを組み合わせます。
混合モード(プロトタイプモード +コンストラクターモード)
function blog(name、url、friend){this.name = name; this.url = url; this.friend = friend;} blog.prototype.alertinfo = function(){alert(this.name + this.url + this.friend);} var blog( 'wuyuchang'、 'http://tools.vevb.com/'、 'fr1'、 'fr3']、 'fr3'] 'http://**.com'、['a'、 'b']); blog.friend.pop(); blog.alertinfo(); // wuyuchanghttp://tools.vevb.com/fr1,fr2blog2.alertinfo(); // wychttp://**.coma、bハイブリッドモードでは、コンストラクターモードを使用してインスタンス属性を定義し、プロトタイプモードはメソッドと共有属性を定義するために使用されます。各インスタンスには独自のインスタンス属性がありますが、同時にメソッドを共有し、メモリを最大限に保存します。さらに、このモードは、初期パラメーターのパスもサポートしています。多くの利点。このパターンは、ECMAScriptでカスタムオブジェクトを作成する最も広く使用され、最も認識されている方法です。
動的プロトタイプモード
動的プロトタイプモードは、コンストラクターのすべての情報をカプセル化し、コンストラクターのプロトタイプを初期化することにより(最初のオブジェクトがインスタンス化されたときにプロトタイプのみが初期化されます)、これにより、メソッドが有効かどうかを判断することでプロトタイプを初期化する必要があるかどうかを選択できます。
function blog(name、url){this.name = name; this.url = url; if(typeof this.alertinfo!= 'function'){//このコードは、アラート( 'exe time'); blog.prototype.alertinfo = function(){alert(thia.name + this.url); }}} var blog = new blog( 'wuyuchang'、 'http://tools.vevb.com')、blog2 = new blog( 'wyc'、 'http:***。com');上記の例では、ウィンドウが「exe time」、つまり、ブログが初期化されている場合、ブログ2がプロトタイプを初期化する必要がないことがわかります。このパターンを使用してオブジェクトを作成するために、完璧と見なすことができます。
このブログ投稿では、「JavaScript Advanced Programming」の第3版を参照していますが、言語は簡素化されており、例が書き直されています。ご質問がある場合は、メッセージを残して返信してください。著者はブログを更新します。