1. パターンを直接作成します。これは最も単純で簡単なパターンです。最初に参照型のオブジェクトを作成し、それにカスタム プロパティとメソッドを追加します。サンプル コードは次のとおりです。
ご覧のとおり、上で Object 型のオブジェクトが作成され、次に name 属性と age 属性が作成されます。とspeakメソッドが追加されます。パターンを直接作成するのは簡単ですが、その欠点は明らかです。同じオブジェクトを多数作成する必要がある場合、毎回コードを繰り返し書かなければなりません。この問題を解決するには、オブジェクトを作成するプロセスをカプセル化することができるため、次のファクトリ パターンを用意します。
2. ファクトリーモード。ファクトリ パターンは、プログラミングでよく使用されるデザイン パターンで、主にオブジェクトの作成プロセスをカプセル化します。サンプル コードは次のとおりです。
alert(this.name "は " this.age " 歳です");
}
var person1 = 新しい人物("サム", 16);
var person2 = 新しい人物("ジャック", 18)
alert(person1.speak == person2.speak); ; // 真
問題は解決されましたが、この方法では新たな問題が生じます。まず、関数 speech はグローバル スコープで宣言されていますが、グローバル スコープに配置すると誤用の危険性があります。次に、カスタム タイプに多くのメソッドがある場合、次のようにする必要があります。多くのグローバル関数を宣言すると、グローバル スコープの汚染につながるだけでなく、コードのカプセル化にも役立ちません。それでは、グローバル スコープを汚さずにクラスにバインドされたカスタム型メソッドを作成する方法はあるのでしょうか?答えは、プロトタイプ パターンを使用することです。
4. プロトタイプモード。新しい関数を宣言すると、その関数 (JavaScript では関数もオブジェクトです) はプロトタイプ属性を持ちます。プロトタイプは、この関数によって作成されたすべてのオブジェクトが所有するパブリック プロパティとメソッドを表すオブジェクトです。サンプル コードは次のとおりです。
function person(){ }
person.prototype.name="サム";
person.prototype.age=16;
person.prototype.speak = function(){
alert( this.name "は " この .age " 歳です");
}
var person1 = new Person();
var person2 = new Person();
alert(person1. speech == person2.speak); // true
speak メソッドはコンストラクターで宣言されていませんが、作成したオブジェクト person1 がこれは、JavaScript には検索ルールがあるため、最初にインスタンスの属性とメソッドを検索し、見つからない場合はそれらを返し、プロトタイプ内を検索します。プロトタイプ パターンでは、メソッドがクラスに関連付けられ、グローバル スコープを汚染しませんが、独自の欠点もあります。まず、すべてのプロパティもクラスに関連付けられます。つまり、すべてのオブジェクトがプロパティを共有することになります。これは明らかに不合理です。 ; 次に、初期化データをコンストラクターに渡す方法がありません。解決策は簡単で、コンストラクター パターンとプロトタイプ パターンを組み合わせて使用するだけです。
5. 組み合わせモード。サンプル コードは次のとおりです。
関数 人(名前, 年齢){
この.名前 = 名前;
この.年齢 = 年齢;
人.prototype.speak = function(){
アラート(この.name "は " この .age " 歳です");
var person1 = new person();
var person2 = new person(); 🎜>alert(person1.speak == person2.speak); // true
組み合わせモードがすべてのニーズを満たしていることを見つけるのは難しくありません。また、それは現在使用されているモードでもあります。広く使用されています。オブジェクト指向プログラミングの経験のある開発者にとっては、プロトタイプ宣言をコンストラクターの外に置くのは少し面倒に感じるかもしれませんが、コンストラクターの中に置くことはできますか?答えは「はい」です。動的結合モードを使用してください。
6. ダイナミック結合モード。原則として、まずプロトタイプ内の特定の属性またはメソッドが宣言されているかどうかを判断し、宣言されていない場合はプロトタイプ全体を宣言し、何も実行しません。サンプル コードは次のとおりです。
コードをコピー
if (人.prototype.speak == "未定義"){
人.プロトタイプ.speak = function() {
alert(this.name "は " this.age " 歳です")
}
}
}