再学ぶオブジェクト指向JavaScriptプログラミング(継承)

1.継承

ESは主に達成するために、そのプロトタイプチェーンに依存実装の継承と実装の継承をサポートしています。

2.プロトタイプチェーン

ES概念プロトタイプは、主鎖および方法のプロトタイプの実装の継承として、鎖中に記載します。基本的な考え方は、参照型は参照プロパティとメソッドの別のタイプから継承するためにプロトタイプを使用することです。

関係コンストラクタ、プロトタイプとの例を思い出してください

各コンストラクタは、プロトタイプオブジェクトを有する、プロトタイプオブジェクトは、コンストラクタを指すポインタを含む、および実施例はすべて、プロトタイプオブジェクトへのポインタを含みます。我々はプロトタイプオブジェクトを作るのであれば種類の別のインスタンスに等しいです。このとき、その後、プロトタイプオブジェクトは、別のプロトタイプを指すポインタが含まれています、それに対応し、別のプロトタイプはまた別のコンストラクタを指すポインタが含まれています。

プロトタイプは、別のタイプ、そのようなプログレッシブ層の別の例であればさらに、それは一例であり、プロトタイプチェーンを構成しています。これは、基本的な概念のプロトタイプチェーンです。

function SuperType(){
    this.property = true
}

SuperType.prototype.getSuperValue = function(){
    retrun this.property
}

function SubType(){
    this.subproperty = false
}

// 继承了 SuperType
SubType.prototype = new SuperType()
SubType.prototype.getSubValue = function(){
    retrun this.subproperty;
}

var instance = new SubType()
instance.getSuperValue()    // true
上記のコードは、2つのタイプを定義します。

スーパータイプとサブタイプ。各属性は、それぞれの種類や方法があります。主な違いは次のとおりです。

サブタイプがスーパータイプを継承し、継承は、インスタンススーパータイプを作成することであり、そのインスタンスSubType.prototype実装を割り当てます。本質プロトタイプオブジェクトインプリメンテーションは、タイプの新しいインスタンスで置き換え、書き換えられます。

今、本SubType.prototype中でスーパータイプのインスタンスである言い換えれば、すべてのメソッドおよびプロパティ。SubType.prototypeメソッドを追加した後、このようにスーパータイプの基本的なプロパティとメソッドを継承する新しいメソッドを追加しました。インスタンスとコンストラクタとプロトタイプとの間の関係のこの実現。

プロトタイプチェーンを実装することで、拡張された検索メカニズムのプロトタイプは、基本的に、インスタンスへのアクセスがリードモードに属性とき、例の最初の属性を検索します。プロパティが見つからない場合、検索はプロトタイプのインスタンスを継続していきます。プロトタイプチェーンを通して継承の場合には、検索処理は、プロトタイプチェーンを継続することです。最後のステップまでの方法を見つけることができます。プロパティとメソッドの場合は見つけることができない、検索処理が停止しますプロトタイプチェーンに常に前方リングのです。

3.デフォルトのプロトタイプ

すべての参照型はデフォルトのオブジェクトに継承され、これが実現するために、プロトタイプチェーンを通じて継承されます。デフォルトの関数はオブジェクトのすべてのインスタンスのプロトタイプであるので、それはデフォルトのプロトタイプの内部ポインタのObject.prototypeが含まれます。だからこそ、すべてのカスタムタイプが継承されているのtoString()デフォルトの、のvalueOf()メソッドであります

プロトタイプの間の関係の4例および

あなたは決定され、2つの方法の試作例関係することができます。第一の方法は、プロトタイプチェーンをテストするために、オペレータは、インスタンスコンストラクタを介して行われその結果は限りtrueを返し、instanceof演算子を使用することです。次のように:

instance instanceof Object  // true

第二の方法は、isPrototypeOf()限りプロトタイププロトタイプチェーンがあったとして、プロトタイプチェーンのプロトタイプ例であると言うことができる方法は、同一の、誘導され、従ってisPrototypeOf()メソッドもtrueを返すあります

Object.prototype.isPrototypeOf(instance)    // true

5.慎重にする方法は、定義されました

サブタイプは時々 、スーパータイプをオーバーライドする必要がある、またはスーパータイプのメソッドが存在しない追加する必要がありますが、どのような場合には、プロトタイプのメソッドを追加するコードを配置する必要があります後のステートメントは、プロトタイプを置き換えます

function  SuperType() {
    this.property = true
}

SuperType.prototype.getSuperValue = function(){
    retrun this.property
}

function SubType() {
    this.subproperty = false
}
----
// 继承了SuperType
SubType.prototype = new SuperType()

// 添加新方法
SubType.prototype.getSubValue = function(){
    retrun this.subproperty
}
//重写超类型中的方法
SubType.prototype.getSuperValue = function(){
    retrun false
}
-----
var instance = new SubType()
instance.getSuperValue()    // false
上記のコードは、方法の2つの離間した部分に定義されています。

第一の方法getSubValue()はサブタイプに追加され、第2の方法getSuperValue()メソッドプロトタイプは、鎖中に既に存在しているが、この方法は、シールドの元のメソッドをオーバーライドします。

つまり、インスタンスのサブタイプがgetSuperValue()を呼び出したときに、このメソッドが呼び出さ再定義されていますが、元のメソッドを呼び出すしていきます()のgetSuperValueスーパータイプの例を、呼び出すことによって、すべてのスーパータイプである必要があります代替的に、試作例の後に、これらの2つの方法の定義。

注記:達成するために、プロトタイプチェーンを通じて継承されたとき、あなたはプロトタイプのメソッドを作成することはできません、それはプロトタイプをオーバーライドしてしまうため、オブジェクトリテラルを使用していること。

質問6.プロトタイプチェーン

プロトタイプチェーンは非常に強力ですが、継承を実装するために使用することができますが、いくつかの問題があります。

図1に示すように、基準値タイプからプロトタイプを含みます。プロトタイプへの参照を含む前属性タイプ値はすべてのインスタンスによって共有されると述べました。だから、これはプロトタイプオブジェクトで定義された属性の原因はなぜコンストラクタであり、そしてません。継承はプロトタイプによって実現される場合、原型は、実際には別のタイプの例となるであろう。したがって、元のインスタンスのプロパティは、当然、現在のプロトタイププロパティにします。

図2は、サブタイプのインスタンスを作成するときに、スーパータイプのコンストラクタにパラメータを渡すことができません。事実の下では、すべてのオブジェクトインスタンスがスーパータイプのコンストラクタパスパラメータに、ケースには影響を与えない方法がないと言うことができます。

7.ボローコンストラクタ

サブタイプのコンストラクタ内のスーパータイプのコンストラクタ呼び出しの使用。そのコンストラクタは、適用()および()メソッドの呼び出しによって、新しく作成されたオブジェクトに対して実行することができます。

7.1パスパラメータ

プロトタイプチェーンに関しては、コンストラクタは、コンストラクタのスーパータイプサブタイプのコンストラクタに引数を渡すことができ、大きな利点を持ってい借ります。

function s(name) {
    this.name = name
}

function b() {  
    // 继承 s,同时还传递参数
    s.call(this, 'nnn')
    // 实例属性
    this.age = 23
}

let i = new B()

i.name // nn
i.age  // 29

7.2コンストラクタの問題を借ります

唯一のコンストラクタを借りるならば、それはコンストラクタモードの問題が存在することを避けることができない、方法は、コンストラクタで定義されているので、機能の再利用を実現することができません。メソッド定義されたスーパータイプのプロトタイプでは、サブタイプの点では見えません。すべてのタイプの結果は、コンストラクタモードを使用することができます。だから、めったに単独で使用しないコンストラクタモードを借ります。

継承の組み合わせ8.

また、擬似古典的な継承と呼ばれ、それは、プロトタイプの組み合わせを意味し、コンストラクタに、当技術分野でチェーンを借ります。両方の長所を継承モードのいずれかを再生するには。原理的には、プロトタイプの実装の継承チェーンのプロパティとメソッドのプロトタイプを使用すること、及び借りコンストラクタによって継承インスタンス属性を達成することです。

9.原型継承

まず、既存のオブジェクトによって新たなオブジェクトを作成し、一時的なコンストラクタを作成し、コンストラクタのプロトタイプとしてオブジェクトを渡し、そして一時的タイプの新しいインスタンスを返します。

10.寄生継承

のみ連続のプロセスのためのカプセル化機能を作成し、何らかの方法で関数は、オブジェクトの内部に強化し、オブジェクトを返します。同様に、私たちが行うことができない多重化機能は、効率を低下させ

11.概要

ESオブジェクト指向プログラミングをサポートしていますが、クラスやインタフェースを使用していません。オブジェクトは、コードの実行中に作成し、向上させることができ、それはダイナミックではなく、厳格に定義されたエンティティを持っています。クラスの非存在下で、プラントモデルは、オブジェクトを作成するためのコンストラクタモード、原型パターンを採用してもよいです。

11.1ファクトリパターン

、簡単な機能を持つオブジェクトを作成したオブジェクトのプロパティとメソッドを追加し、オブジェクトを返します。このモードは、コンストラクタモードで置き換えられます

11.2コンストラクタモード

new演算子として使用するオブジェクトのインスタンスを作成するために構築することができますよう、カスタム参照型を作成します。しかし、コンストラクタモデルは、そのメンバーの各々は機能を含む、再利用できないという欠点を有します。機能するので、任意のオブジェクトに限定することはできません。だから、複数のオブジェクト間で共有されなくなりまし機能する理由はありません。

11.3プロトタイプモデル

これらのプロパティとメソッドが共有されるように指定するためにコンストラクタのprototypeプロパティを使用します。コンストラクタインスタンスプロパティを使用して、組み合わせプロトタイプモデルコンストラクタモードで使用されるときに定義され、そしてプロトタイプ共有プロパティおよびメソッドを使用して定義されます。

JSは、主にプロトタイプ継承チェーンを通じて達成します。プロトタイプ鎖は、インスタンスのプロトタイプの実装では、別の型コンストラクタに割り当てられています。このように、子供は性質やスーパータイプのメソッドのすべてのタイプにアクセスすることができます。これとクラスベースの継承は非常に似ています。

問題のプロトタイプチェーンは、オブジェクト・インスタンスが、すべてのプロパティとメソッドを継承し、したがって、単独で使用するのに適していない共有されています。あなたはこの問題を解決したい場合は、我々は、サブタイプのコンストラクタ内でスーパークラスのコンストラクタタイプを呼び出すコンストラクタの援助を必要とします。これは、各インスタンスで行うことができる唯一のコンストラクタモードを確保するタイプを定義しながら、独自の特性を有します。

11.4原型継承

継承は、本質的に、指定されたオブジェクトの浅いコピーを実行れ、事前に定義されたコンストラクタなしで実施することができます。そして、コピーのコピーは、さらなる改革することができ得ます

11.5寄生継承

そして、原型継承は非常に似ていますが、また、オブジェクトや一部の情報に基づいてオブジェクトを作成し、オブジェクトを高め、最終的にオブジェクトを返します。非効率につながっ型コンストラクタ上の複数の呼び出しによる遺伝パターンの組み合わせを解決するために、このモードでは、継承の組み合わせで使用することができると

11.6複合寄生継承

継承の組み合わせの寄生コレクタ継承及び利点は、型の継承に基づいて最も効果的な方法

国民の関心少数[学生]八尾

いいえ、小さな公共入札の同級生ません

おすすめ

転載: www.cnblogs.com/lieone/p/11611528.html