コードの再利用とその原則
名前が示すように、代码复用、新しいプログラムを構築するために書かれたコードの部分またはすべてを再利用することです。コードの再利用について話すとき、私たちが最初に考えることができるのは继承性です。コードの再利用の原則は次のとおりです。
优先使用对象组合,而不是类继承JSでは、クラスの概念がないため、インスタンスの概念はあまり意味がありません。 JSのオブジェクトは、動的に作成および変更できる単純なキー価値ペアです。
しかし、 jsでは、クラスを使用する他のプログラミング言語と構文の類似性を持つコンストラクターとnew演算子を使用してオブジェクトをインスタンス化できます。
例えば:
var trigkit4 = new Person(); jsコンストラクターのPersonに電話をかけるときのクラスのようですが、実際には機能であり、クラスに基づいていると想定されるいくつかの開発のアイデアと継承パターンを提供します。
従来の継承モデルにはclassキーワードが必要です。上記のクラス継承モデルは现代继承模式であり、クラスの方法で考慮する必要のないモデルであると仮定します。
古典的な継承モード
コンストラクターのParent()とChild()の次の2つの例を参照してください。
<script type="text/javascript">function parent(name){
this.name = name || 「アレン」;
}
parent.prototype.say = function(){
this.nameを返します。
}
function child(name){}
//親コンストラクターでオブジェクトを作成し、継承を達成するためにオブジェクトを子プロトタイプに割り当てます
関数継承(c、p){
c.prototype = new P(); //プロトタイプ属性は、関数ではなくオブジェクトを指す必要があります
}
//宣言された継承された関数を呼び出します
相続(子、親);
</script>
new Child()ステートメントを使用してオブジェクトが作成されると、次のようなプロトタイプを介してParent()インスタンスから機能を取得します。
var kid = new Child();kid.say();//Allenプロトタイプチェーン
プロトタイプチェーンがクラス継承モードでどのように機能するかについて説明しましょう。オブジェクトは、データと他のブロックへの参照を含むメモリ内のブロックと考えています。 new Parent()ステートメントを使用してオブジェクトが作成されると、下の図の左側にあるこのようなブロックが作成されます。このブロックはname属性を保存します。 say()メソッドにアクセスする場合は、コンストラクターのParent()のprototype属性を指すことにより、右側のParent.prototype __proto__にアクセスできます。
では、 var kid = new Child()で新しいオブジェクトを作成するとどうなりますか?下の図に示すように:
new Child()ステートメントを使用して作成されたオブジェクトは、暗黙のリンク__proto__を除き、ほとんど空です。この場合、 __proto__ 、 inherit()関数のnew Parent()ステートメントを使用して作成されたオブジェクトを指します
kid.say()を実行すると、左下隅のブロックオブジェクトにはsay()メソッドがないため、プロトタイプチェーンを介して中央のブロックオブジェクトを照会します。ただし、中央のブロックオブジェクトにはsay()メソッドもないため、プロトタイプチェーンに従って右端のブロックオブジェクトを照会し、オブジェクトにはsay()メソッドがあります。終了しましたか?
ここでは実行が終了しません。 this.nameは、コンストラクターによって作成されたオブジェクトを指すsay()メソッドで参照されます。ここでは、ブロックnew Child()を指します。ただし、 new Child()にはname属性はありません。このため、中間ブロックがクエリになり、中間ブロックにはname属性があります。この時点で、プロトタイプチェーンのクエリが完了しました。
詳細については、私の記事をご覧ください:JavaScript Learning Notes(v)プロトタイプとプロトタイプチェーンの詳細な説明
共有プロトタイプ
このパターンのルールは、再利用可能なメンバーをこれに配置するのではなく、プロトタイプに転送する必要があるということです。したがって、継承の目的のために、継承する価値のあるものはすべてプロトタイプに実装されるべきです。したがって、子オブジェクトのプロトタイプと親オブジェクトのプロトタイプを以下の例と同じに設定できます。
function inherit(C,P){c.prototype = p.prototype;
}
子オブジェクトと親オブジェクトは同じプロトタイプを共有し、 say()メソッドに等しくアクセスできます。ただし、子オブジェクトはname属性を継承しません
プロトタイプの継承
プロトタイプ継承は、「現代の」クラスレス相続モデルです。次の例を参照してください。
<script type="text/javascript">//継承されるオブジェクト
var parent = {
名前:「ジャック」//ここにはセミコロンはありません
};
//新对象var child = object(parent);
alert(child.name);//Jack</script>
プロトタイプモードでは、オブジェクトリテラルを使用して親オブジェクトを作成する必要はありません。次のコードに示すように、コンストラクターを使用して親オブジェクトを作成できます。そうすることで、独自の特性とコンストラクターのプロトタイプの特性の両方が継承されます。
<script type="text/javascript">//親コンストラクター
function person(){
this.name = "trigkit4";
}
//プロトタイプ属性に追加します
person.prototype.getName = function(){
this.nameを返します。
};
//新しい人クラスオブジェクトを作成します
var obj = new person();
//継承
var kid = object(obj);
alert(kid.getname()); // trigkit4
</script>
このモードでは、既存のコンストラクターに存在するプロトタイプオブジェクトのみを継承することを選択できます。次の例に示すように、親オブジェクトの作成方法に関係なく、オブジェクトはオブジェクトから継承されます。
<script type="text/javascript">//親コンストラクター
function person(){
this.name = "trigkit4";
}
//プロトタイプ属性に追加します
person.prototype.getName = function(){
this.nameを返します。
};
//新しい人クラスオブジェクトを作成します
var obj = new person();
//継承
var kid = object(person.prototype);
console.log(typeof kid.getName); //機能。プロトタイプにあるためです
console.log(typeof kid.name); //未定義、このプロトタイプのみが継承されているため
</script>