2。JavaScriptオブジェクト指向プログラミング:コンストラクターの継承
このセクションでは、主に複数のオブジェクトを「継承」するインスタンスを生成する方法を紹介します。
たとえば、「動物」オブジェクトのコンストラクターがあります。
function animal(){this.species = "animal"; }「猫」のオブジェクトコンストラクターもあります、
function cat(name、color){this.name = name; this.color = color; }「猫」はどのようにして「動物」を継承できますか?
1。コンストラクター結合
最も簡単な方法は、おそらくコールまたは適用方法を使用して、親オブジェクトのコンストラクターを子オブジェクトにバインドすることです。つまり、子オブジェクトコンストラクターに行を追加することです。
function cat(name、color){animal.apply(this、arguments); this.name = name; this.color = color; } var cat1 = new Cat( "Big Hair"、 "Yellow");アラート(cat1.species); // 動物2。プロトタイプモード
より一般的なアプローチは、プロトタイプ属性を使用することです。
「猫」のプロトタイプオブジェクトが動物のインスタンスを指している場合、「猫」のすべてのインスタンスは動物を継承する可能性があります。
cat.prototype = new Animal(); cat.prototype.constructor = cat; var cat1 = new Cat( "Big Hair"、 "Yellow");アラート(cat1.species); // 動物
コードの最初の行で、CATプロトタイプオブジェクトは動物のインスタンスを指します。
1.cat.prototype = new Animal();
プロトタイプオブジェクトの元の値を完全に削除し、新しい値を割り当てることと同等です。しかし、2行目はどういう意味ですか?
1.cat.prototype.constructor = cat;
すべてのプロトタイプオブジェクトには、コンストラクター機能を指すコンストラクター属性があることがわかります。言い換えれば、cat.prototypeオブジェクトのコンストラクタープロパティはcatを指しています。
前のステップでこのプロトタイプオブジェクトの元の値を削除したため、新しいプロトタイプオブジェクトにはコンストラクター属性がないため、手動で追加する必要があります。そうしないと、後続の「継承チェーン」に問題があります。これが2行目の意味です。
要するに、これは非常に重要なポイントであり、プログラミング時にそれに従わなければなりません。次のすべてが次のとおりです。プロトタイプオブジェクトが置き換えられている場合、
1.O.Prototype = {};
次に、次のステップは、コンストラクター属性を新しいプロトタイプオブジェクトに追加し、この属性を元のコンストラクター関数に参照することです。
1.o.prototype.constructor = o;
3.プロトタイプを直接継承します
動物オブジェクトでは、変更されていない特性はAnimal.prototypeに直接記述できます。したがって、cat()を動物()スキップさせ、動物.prototypeを直接継承することもできます。
さて、最初に動物オブジェクトを書き直しましょう。
1.機能動物(){}
2.Animal.prototype.species = "Animal";
次に、猫のプロトタイプオブジェクトを指して、動物のプロトタイプオブジェクトを指して、継承が完了するようにします。
cat.prototype = animal.prototype; catcat.prototype.constructor = cat; var cat1 = new Cat( "Big Hair"、 "Yellow");アラート(cat1.species); //動物
前者の方法と比較して、これの利点は、それが比較的効率的であり(動物インスタンスを実行して作成する必要はない)、より多くの記憶を節約することです。欠点は、cat.prototypeとanimal.prototypeが同じオブジェクトを指しているため、cat.prototypeの変更は動物に反映されることです。プロトタイプに反映されます。
したがって、上記のコードには実際には問題があります。 2行目をご覧ください
1.cat.prototype.constructor = cat;
この文は実際に動物のコンストラクター属性を変更しました。プロトタイプオブジェクト!
1.Alert(Animal.Prototype.Constructor); // 猫
4.空のオブジェクトを仲介者として使用します
「プロトタイプの直接継承」には上記の欠点があるため、空のオブジェクトは仲介者として使用できます。
var f = function(){}; f.prototype = animal.prototype; cat.prototype = new f(); cat.prototype.constructor = cat;Fは空のオブジェクトなので、ほとんどメモリを占有しません。現時点では、CATプロトタイプオブジェクトを変更しても、動物のプロトタイプオブジェクトには影響しません。
1.Alert(Animal.Prototype.Constructor); // 動物
5。プロトタイプモードのカプセル化関数
上記の方法を機能にカプセル化し、使いやすいようにします。
function endoct(child、parent){var f = function(){}; f.prototype = parent.prototype; child.prototype = new f(); child.prototype.constructor = child; child.uber = parent.prototype; }それを使用する場合、メソッドは次のとおりです
拡張(猫、動物); var cat1 = new Cat( "Big Hair"、 "Yellow");アラート(cat1.species); // 動物
この拡張機能は、YUIライブラリが継承を実施する方法の方法です。
また、説明させてください。関数本体の最後の線
1.child.uber = parent.prototype;
これは、子オブジェクトのプロトタイプ属性を直接指す子オブジェクトにuber属性を設定することを意味します。これは、子オブジェクトにチャネルを開いて、親オブジェクトの方法を直接呼び出すのと同等です。このラインは、継承の完全性を達成するためだけにここに配置されており、純粋に予備の財産です。
6.継承をコピーします
上記は、プロトタイプオブジェクトを使用して継承を実装することです。また、思考を変更し、「コピー」メソッドを使用して継承を達成することもできます。簡単に言えば、親オブジェクトのすべてのプロパティとメソッドが子オブジェクトにコピーされている場合、継承は達成できませんか?
まず、動物のすべての変更されていない特性をそのプロトタイプオブジェクトに置きます。
1.機能動物(){}
2.Animal.prototype.species = "Animal";
次に、別の機能を記述して、プロパティコピーの目的を達成します。
関数extend2(子、親){var p = parent.prototype; var c = child.prototype; for(var i in p){c [i] = p [i]; } c.uber = p; }この関数の関数は、親オブジェクトのプロトタイプオブジェクトのプロパティを、子オブジェクトのプロトタイプオブジェクトに1つずつコピーすることです。
それを使用するとき、これを書いてください:
extend2(猫、動物); var cat1 = new Cat( "Big Hair"、 "Yellow");アラート(cat1.species); // 動物
上記の記事JavaScriptのオブジェクト指向プログラミングの詳細な分析は、私があなたと共有するすべてのコンテンツです。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。