オブジェクト指向言語(JSはオブジェクトベース)として、継承を実装することが不可欠ですが、クラス自体の概念がないため、実際のオブジェクト指向プログラミング言語などのクラスを介して継承を実装することはありませんが、他の方法を介して継承を実装できます。継承を実装するには多くの方法があり、以下はそのうちのほんの一部です。
1。プロトタイプチェーンの継承
function person(){//継承された関数は、supertype(親クラス、ベースクラス)this.name = 'mumu'と呼ばれます。 this.age = '18 '; } person.prototype.name = 'susu'; //属性名が同じ場合、最初にインスタンスで検索する必要がありますが、プロトタイプに移動して関数ワーカー()を見つけます{//継承された関数はサブタイプ(サブクラス、派生クラス)this.job = 'sudent'; } worker.prototype = new person(); //プロトタイプチェーンを介して継承されたスーパータイプによってインスタンスされたオブジェクトインスタンスは、サブクラスvar p2 = new Worker()のプロトタイプ属性に割り当てられます。 console.log(p2.name); console.log(p2 instanceof object); //すべてのコンストラクターはオブジェクトから継承されます上記の継承を実装するための鍵は次のとおりです。Worker.Prototype= new Person();ワーカーのプロトタイプを人のインスタンスにし、プロトタイプチェーンを介してそれを継承します。
注:プロトタイプチェーンを使用して継承を実装する場合、オブジェクトリテラルを使用してプロトタイプメソッドを作成することはできません。これにより、関係が中断され、プロトタイプチェーンが書き直されるためです。
プロトタイプチェーン相続問題:
1.参照共有の問題がありますが、それらはまだ同じスペースを共有しており、サブクラスは親クラスに影響します。
function person(){this.bodys = ['eye'、 'foot']; } function worker(){} worker.prototype = new person(); var p1 = new Worker(); p1.bodys.push( 'hand'); var p2 = new Worker(); console.log(p1.bodys); console.log(p2.bodys);2。サブタイプのインスタンスを作成する場合、スーパータイプコンストラクターでパラメーターを渡すことはできません。
では、プロトタイプチェーンの2つの問題を解決する方法は?その後、以下の継承方法を見続けます〜
2。借入コンストラクター継承(オブジェクトのなりすまし、偽造オブジェクト、または古典的な継承とも呼ばれます)
function person(name、age){this.name = name; this.age = age; this.bodys = ['eye'、 'foot']; } person.prototype.showname = function(){console.log(this.name); } function worker(name、age、job){person.call(this、name、age); this.job = job; // subclass add attributes} var p1 = new Worker( 'mumu'、 '18'、 'student'); p1.bodys.push( 'hand'); var p2 = new Worker(); console.log(p1.name); console.log(p2.bodys); console.log(p1.showname());借りたコンストラクターを使用する上記の原則の簡単な分析:person.call(this、name、age);このコードは、親コンストラクターを呼び出し、親属性を継承し、コールメソッドを使用して、関数が実行されたときにこれを変更するために人を呼び出します。ここで、これは - > newはワーカーオブジェクトコンストラクターの偽装方法です。
参照タイプがコンストラクターに配置されている場合、それは共有されないため、P2は影響を受けません。
コンストラクター継承方法を借りると、プロトタイプチェーンがパラメーターを渡して参照タイプを共有できないという問題を解決します。
ヒント:call()およびapply()メソッドは、機能実行の範囲を変更すると、要するに、この関数によって指摘されたコンテンツを変更できます。
call()とapply()の両方が2つのパラメーターを受け入れます。1つ目は、その中で実行されている関数の範囲で、もう1つは渡されたパラメーターです。
コールと適用の違いは、パラメーターの違いです。
呼び出しのパラメーターは、1つずつ列挙する必要があります。
適用のパラメーターは、配列または引数オブジェクトでなければなりません
質問は次のとおりです。なぜp1.showname()の結果が間違っているのですか? ----コンストラクターを借用する継承方法は、コンストラクター内の属性とメソッドのみを継承できるためです。ここでは、コンストラクターを借用する問題も見つかります。
注:すべてのメソッドをコンストラクターに配置するため、インスタンス化するたびにメモリスペースを割り当てるたびにリソースを浪費するため、通常、コンストラクターのプロトタイプと属性にメソッドを配置します。
借入コンストラクターの相続問題:
コンストラクターを借用すると、コンストラクター内のプロパティとメソッドのみを継承できるため、スーパータイプのプロトタイプで定義されている方法はサブクラスに見えないため、プロトタイプがないことに相当します。その結果、すべてのメソッドはコンストラクターでのみ定義できるため、関数の多重化はありません。
それでは、コンストラクターを借りることによって引き起こされる問題を解決する方法は?次に、次の継承方法に依存します
3。組み合わせ継承(擬似クラシック継承)
function person(name、age){this.name = name; this.age = age; } person.prototype.showname = function(){console.log(this.name); } function worker(name、age、job){person.call(this、name、age); // broarn constructor this.job = job; } worker.prototype = new person(); //プロトタイプチェーン継承var p1 = new Worker( 'mumu'、 '18'、 'sudent'); console.log(p1.age); p1.showname();組み合わせ継承:プロトタイプチェーンと借りたコンストラクターを組み合わせます。
アイデア:プロトタイプチェーンを使用して、プロトタイプ上の属性とメソッドの継承を実装し、コンストラクターを借用してインスタンス属性の継承を実装することにより
上記の例person.call(this、name、age);コンストラクターを借りて属性を継承します
worker.prototype = new Person();プロトタイプチェーンはメソッドを継承し、2つの欠点を回避し、その利点を組み合わせて、最も一般的に使用される継承モデルになります。
継承の組み合わせの問題:
SuperTypeコンストラクターは、サブタイプのプロトタイプを作成するときに1回、サブタイプコンストラクター内の他の時間を作成するときに2回呼び出されます。
この問題を解決するには、寄生的な組み合わせ継承を使用する必要があります。
4。プロトタイプの継承
function object(proto){function f(){} f.prototype = proto;新しいf()を返します。 } var person = {name: 'mumu'、friends:['xiaxia'、 'susu']}; var anotherperson = object(person);別の人。FriendS.Push( 'wen'); var yetnotherperson = object(person);別の人。FriendS.Push( 'Tian'); console.log(person.friends); // ["xiaxia"、 "susu"、 "wen"、 "tian"] console.log(aterneperson .__ proto __)// object {name: "mumu"、friends:array [4]}簡単な分析:関数オブジェクト(ProTO)は一時的なリレー関数であり、その中のパラメータープロトは渡されるオブジェクトを表します。F()コンストラクターは、渡されたオブジェクトを保存するために使用される一時的な新しく作成されたオブジェクトです。 f.prototype = proto; fコンストラクターのプロトタイプオブジェクトにオブジェクトインスタンスを割り当て、最後に渡されたオブジェクトのオブジェクトインスタンスを返します。プロトタイプの継承または共有参照タイプの属性。
5。寄生性継承
//一時トランジット関数オブジェクト(proto){function f(){} f.prototype = proto;新しいf()を返します。 } //寄生虫関数Create(proto){var f = object(proto); f.love = function(){return this.name; } furne f; } var person = {name: 'mumu'、friends:['xiaxia'、 'susu']}; var anotherperson = create(person); console.log(anotherperson.love());寄生的な組み合わせ継承6.寄生的な組み合わせ継承
function object(proto){function f(){} f.prototype = proto;新しいf()を返します。 } //寄生虫関数関数create(人、ワーカー){var f = object(person.prototype); // create object f.constructor = worker; //プロトタイプ構築ポインターを調整し、オブジェクトworker.prototypeを強化します。 this.age = age; } person.prototype.showname = function(){console.log(this.name); } function worker(name、age、job){person.call(this、name、age); this.job = job; } create(person、worker); //寄生虫の組み合わせ継承var p1 = new person( 'mumu'、 '18'、 'sudent'); p1.showname();この方法は、現在継承方法を実装する最も完璧で理想的な方法でもあります。
上記のJavaScript継承学習ノート[初心者向けに読まなければならない]は、編集者が共有するすべてのコンテンツです。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。