初渉JavaScriptモード(7):プロトタイプモード【三】
2656 ワード
コンストラクション関数モードとプロトタイプモードの組み合わせ
前編では,純粋なプロトタイプモードのすべての属性が各インスタンスに公開されているため,構造関数モードとプロトタイプモードを組み合わせて使用できるプロトタイプモードの欠点について述べた.コンストラクション関数はインスタンスのプロパティを定義し、プロトタイプモードはメソッドと共通のプロパティを定義します.これにより、各インスタンスには独自のプロパティコピー(プロトタイプへの参照ではなく)があり、プロトタイプ上のメソッドの参照も共有されます.さらに,このハイブリッドモードは構造関数へのパラメータ伝達もサポートするので,二つのモードを組み合わせた利点と言える.例は次のとおりです.
上記の例では、インスタンス属性はコンストラクション関数で定義されているため、各インスタンスの属性はプライベートなコピーであり、相互に影響しません.一方、プロトタイプで定義されたメソッドでは、各インスタンスの参照は同じメソッド(プロトタイプ上の)を指します.このコンビネーションモードはJSで最も広く使われているカスタムタイプを作成する方法で、推奨されています.
ダイナミックプロトタイプモード
ダイナミックプロトタイプモードは,プロトタイプと構造関数の独立した問題を解決するために用いられる.多くの場合、コンストラクション関数とプロトタイプは互いに独立しており、これは時には美しくないが、コードに潔癖なプログラム猿(例えば私)を解決するために、JSの中で奇妙な解決策を生み出した.このスキームは動的プロトタイプモードであり,すべての情報を構造関数にカプセル化し,構造関数にプロトタイプを初期化することによって(必要に応じてのみ),構造関数モードとプロトタイプモードの利点を保持するだけでなく,単独の相対的独立も解決される.
必要に応じてプロトタイプを初期化するだけで,あるべき方法が有効であるかどうかを調べることで判断できる.コードは次のとおりです.
以上のコードは、プロトタイプが初期化されたかどうかを確認し、それがなければプロトタイプを初期化します.ダイナミックプロトタイプモードを使用する場合、プロトタイプオブジェクトを字面量で書き換えることはできません.これは、既存のインスタンスと新しいプロトタイプの関係を切断するためです.しかし、この方法は使いやすいが、コードの混同を招きやすく、プロトタイプinitをコンストラクション関数に置くのも良い方法ではないと思うので、最後に独立プロトタイプとコンストラクション関数を選んだが、プロトタイプとコンストラクション関数の上にもう1層パッケージを作っただけだ.△好みですから、軽く吹いてください...
まとめ
この3編(この1編は終わり)を通して、原型パターンを大まかにまとめたが、経験と経験の関係で、すべてがそろっていない.文章の内容は高距離、設計モード、プログラミングモードなどを参考にして、書く過程で、自分の知識体系を整理して、収穫が大きいです.
後記
もしあなたが文の中で何か間違いや疑問を見つけたら、私たちは一緒に議論することができます.群239147101(N多JS大神).
前編では,純粋なプロトタイプモードのすべての属性が各インスタンスに公開されているため,構造関数モードとプロトタイプモードを組み合わせて使用できるプロトタイプモードの欠点について述べた.コンストラクション関数はインスタンスのプロパティを定義し、プロトタイプモードはメソッドと共通のプロパティを定義します.これにより、各インスタンスには独自のプロパティコピー(プロトタイプへの参照ではなく)があり、プロトタイプ上のメソッドの参照も共有されます.さらに,このハイブリッドモードは構造関数へのパラメータ伝達もサポートするので,二つのモードを組み合わせた利点と言える.例は次のとおりです.
```javascript
function Animal(name,type){
this.name = name;
this.type = type;
}
Animal.prototype = {
constructor: Animal,
sayName : function(){
console.log("oh ~~~~ "+this.name);
}
};
var tom = new Animal("tom","Cat");
var jerry = new Animal("jerry","Mouse");
console.log(tom.name === jerry.name); //false
console.log(tom.sayName === jerry.sayName); //true
```
上記の例では、インスタンス属性はコンストラクション関数で定義されているため、各インスタンスの属性はプライベートなコピーであり、相互に影響しません.一方、プロトタイプで定義されたメソッドでは、各インスタンスの参照は同じメソッド(プロトタイプ上の)を指します.このコンビネーションモードはJSで最も広く使われているカスタムタイプを作成する方法で、推奨されています.
ダイナミックプロトタイプモード
ダイナミックプロトタイプモードは,プロトタイプと構造関数の独立した問題を解決するために用いられる.多くの場合、コンストラクション関数とプロトタイプは互いに独立しており、これは時には美しくないが、コードに潔癖なプログラム猿(例えば私)を解決するために、JSの中で奇妙な解決策を生み出した.このスキームは動的プロトタイプモードであり,すべての情報を構造関数にカプセル化し,構造関数にプロトタイプを初期化することによって(必要に応じてのみ),構造関数モードとプロトタイプモードの利点を保持するだけでなく,単独の相対的独立も解決される.
必要に応じてプロトタイプを初期化するだけで,あるべき方法が有効であるかどうかを調べることで判断できる.コードは次のとおりです.
```javascript
function Animal(name,type){
this.name = name;
this.type = type;
if(typeof this.sayName != "function"){
Animal.prototype.sayName = function(){
console.log("oh~~~my name is "+this.name);
}
}
}
var tom = new Animal("tom","Cat");
var jerry = new Animal("jerry","Mouse");
console.log(tom.name === jerry.name); //false
console.log(tom.sayName === jerry.sayName); //true
```
以上のコードは、プロトタイプが初期化されたかどうかを確認し、それがなければプロトタイプを初期化します.ダイナミックプロトタイプモードを使用する場合、プロトタイプオブジェクトを字面量で書き換えることはできません.これは、既存のインスタンスと新しいプロトタイプの関係を切断するためです.しかし、この方法は使いやすいが、コードの混同を招きやすく、プロトタイプinitをコンストラクション関数に置くのも良い方法ではないと思うので、最後に独立プロトタイプとコンストラクション関数を選んだが、プロトタイプとコンストラクション関数の上にもう1層パッケージを作っただけだ.△好みですから、軽く吹いてください...
まとめ
この3編(この1編は終わり)を通して、原型パターンを大まかにまとめたが、経験と経験の関係で、すべてがそろっていない.文章の内容は高距離、設計モード、プログラミングモードなどを参考にして、書く過程で、自分の知識体系を整理して、収穫が大きいです.
後記
もしあなたが文の中で何か間違いや疑問を見つけたら、私たちは一緒に議論することができます.群239147101(N多JS大神).