JavaScriptはオブジェクト指向の言語ではなく、従来の継承方法を提供しませんが、継承を達成するために提供するプロトタイププロパティを使用して、プロトタイプ継承の方法を提供します。
プロトタイプチェーンは、JavaScriptの継承の主な方法です。
プロトタイプチェーンの基本的なアイデアは、プロトタイプを使用して、ある参照タイプが別の参照タイプのプロパティと方法を継承できるようにすることです。
コンストラクター、プロトタイプ、およびインスタンス間の関係:各コンストラクターにはプロトタイプオブジェクトがあり、プロトタイプオブジェクトにはコンストラクターへのポインターが含まれ、インスタンスにはプロトタイプオブジェクトへの内部ポインターが含まれています。
プロトタイプオブジェクトが別のオブジェクトのインスタンスに等しい場合、プロトタイプオブジェクトには別のプロトタイプへのポインターが含まれているため、他のプロトタイプには別のコンストラクターへのポインターも含まれます。
プロトタイプチェーンの実装の基本モード:
function supertype(){this.property = true;} supertype.prototype.getsupervalue = function(){return this.property;}; function subtype(){this.subproperty = false;} // enternit supertypesubtype.prototype = supeptoty.protpe.; (){return this.subproperty;}; var instance = new subtype(); alert(instance.getSuperValue()); // 真実サブタイプは、スーパータイプを継承します。これは、スーパータイプのインスタンスを作成し、インスタンスをSubType.prototypeに割り当てることによって達成されます。実装の本質は、プロトタイプオブジェクトを書き換えて、新しいタイプのインスタンスに置き換えることです。このように、もともとSuperTypeインスタンスに存在するプロパティと方法は、SubType.Prototypeにも存在します。次に、SubType.Prototypeにメソッドを追加します。これにより、SuperTypeの特性と方法の継承に基づいて別のメソッドが追加されます。
上記の例のインスタンス関係は、次のように表現されています。
上記は、デフォルトでサブタイプによって提供されるプロトタイプを使用するのではなく、代わりに新しいプロトタイプに置き換えます。この新しいプロトタイプは、スーパータイプのインスタンスです。また、新しいプロトタイプ内でスーパータイプを実行するプロトタイプへのポインターもあります。その結果、インスタンスはサブタイプのプロトタイプを指しており、これはSuperTypeのプロトタイプを指します。 getValue()メソッドはまだsupertype.prototypeですが、プロトタイプはsubtype.prototypeです。これは、プロパティがインスタンスプロパティであり、getSupervalue()がプロトタイプメソッドであるためです。 SubType.Prototypeは現在、SuperTypeのインスタンスであるため、プロパティはその場合に自然に位置しています。
注:instance.constructorは、サブタイプのプロトタイプが別のオブジェクトであるSuperTypeのプロトタイプを指し、このプロトタイプオブジェクトのコンストラクター属性がスーパータイプを指しているため、SuperTypeを指すようになりました。
読み取りモードで属性にアクセスするとき、インスタンスは最初にその属性を検索します。プロパティが見つからない場合。その後、インスタンスのプロトタイプの検索が続きます。プロトタイプチェーンを通じて継承が達成されると、検索プロセスはプロトタイプチェーンに沿って上方に移動し続けることができます。
デフォルトのプロトタイプ
すべての参照タイプはデフォルトでオブジェクトを継承し、この継承はプロトタイプチェーンを介して実装されます。すべての関数のデフォルトのプロトタイプは、オブジェクトのインスタンスです。したがって、デフォルトのプロトタイプには、object.prototypeへの内部ポインターが含まれます。これが、カスタムタイプがtoString()、valueof()などのメソッドを継承する理由です。
完全なプロトタイプチェーン:
上記の継承システムでは、サブタイプはスーパータイプを継承し、スーパータイプはオブジェクトを継承します。 instance.toString()が呼び出されると、object.prototypeに保存された方法が実際に呼び出されます。
インスタンスとプロトタイプの関係を決定します
プロトタイプとインスタンスの関係を決定するには、次の2つの方法があります。
オペレーターのインスタンスを使用します
アラート(オブジェクトのインスタンスインスタンス);アラート(supertypeのインスタンスインスタンス);アラート(サブタイプのインスタンスインスタンス);
プロトタイプチェーン間の関係により、上記のすべてが真実です。
isprototypeof()メソッドを使用します
alert(object.prototype.isprototypeof(instance)); alert(supertype.prototype.isprototypeof(instance)); alert(subtype.prototype.isprototypeof(instance)); alert(subtype.prototype.isprototypeof(instance));
メソッドを慎重に定義します
プロトタイプにメソッドを追加するコードは、プロトタイプを置き換えるステートメントの後に配置する必要があります。
関数supertype(){this.property = true;} supertype.prototype.getsupervalue = function(){return this.property;}; function subtype(){this.subproperty = false;} supertype.protototype = new supertoty(); {return this.subproperty;}; //メソッドsubtype.prototype.getsupervalue = function(){return this.subproperty;}; //メソッドsubtype.prototype.getsupervalue = function(){return fals;}; subtype(); alert(instance.getSuperValue()); // 間違い上記の例では、プロトタイプをSuperTypeのインスタンスに置き換えた後、これらの2つの方法を定義することに注意する必要があります。
さらに、プロトタイプチェーンを介して継承する場合、オブジェクトリテラルを使用してプロトタイプメソッドを作成することはできません。そうすることで、プロトタイプチェーンが書き換えられるからです。
関数supertype(){this.property = true;} supertype.prototype.getsupervalue = function(){return this.property;}; function subtype(){this.subproperty = false;} // enternit supertypesubtype.prototype = infultipe code invalid subtype.prototype = {getsubvalue:function(){return this.subproperty;}、someothermethod:function(){return false;}}; var instance = new subtype(); alert(instance.getsupervalue(); // エラー上記の例は、SuperTypeのインスタンスをプロトタイプに割り当て、プロトタイプをリテラルに置き換えます。現在のプロトタイプには、スーパータイプのインスタンスではなくオブジェクトのインスタンスが含まれており、サブタイプとスーパータイプの間に関係はありません。
プロトタイプチェーンの問題
前述のように、参照タイプを含むプロトタイプ属性は、すべてのインスタンスで共有されます。これが、プロトタイプオブジェクトではなく、コンストラクターで属性を定義する必要がある理由です。
関数supertype(){this.colors = ["red"、 "blue"、 "green"];} function subtype(){} subtype.prototype = new supertype(); var instance1 = new subtype(); instance1.colors.push( "black"); alert(instance1.colors); // "RED"、 "Blue"、 "Green"、 "Black" var instance2 = new Subtype(); alert(instance2.colors); //「赤」、「青」、「緑」、「ブラック」上記の例では、Arrayを含むSuperTypeコンストラクターでColorsプロパティが定義されており、SuperTypeの各インスタンスには独自の配列を含むColorsプロパティがあります。サブタイプがプロトタイプチェーンを介してスーパータイプを継承した後、SubType.PrototypeはSuperTypeのインスタンスになるため、独自の色属性もあります。ただし、サブタイプのすべてのインスタンスは、この1つのColorsプロパティを共有しています。
別の問題は、すべてのオブジェクトインスタンスに影響を与えることなく、パラメーターをスーパークラスコンストラクターに渡す方法がないことです。
上記は、編集者が紹介したプロトタイプチェーン継承に基づいたJavaScriptの関連する知識です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!