1. コンストラクターのバインディング
2. プロトタイプ モード
すべてのプロトタイプ オブジェクトには、そのコンストラクターを指すコンストラクター属性があることがわかります。つまり、Cat.prototype オブジェクトのコンストラクター プロパティは Cat を指します。
前のステップでこのプロトタイプ オブジェクトの元の値を削除したため、新しいプロトタイプ オブジェクトにはコンストラクター属性がないため、手動で追加する必要があります。そうしないと、後で「継承チェーン」に問題が発生します。これが 2 行目の意味です。
つまり、これは非常に重要な点であり、プログラミング時に必ず従わなければなりません。この点の後には次のようになります。つまり、プロトタイプ オブジェクトが置き換えられる場合、
3. プロトタイプを直接継承する
var cat1 = new Cat("Big Hair","Yellow")
alter(cat1.species); // 動物
前の方法と比較して、この方法の利点は、より効率的であり (Animal のインスタンスを実行して作成する必要がない)、メモリを節約できることです。欠点は、Cat.prototype と Animal.prototype が同じオブジェクトを指すようになったため、Cat.prototype への変更が Animal.prototype に反映されることです。
つまり、上記のコードには実際には問題があります。 2 行目を見てください。
Cat.prototype.constructor = Cat;
この文は実際に Animal.prototype オブジェクトのコンストラクター プロパティを変更します。
alert(Animal.prototype.constructor); // Cat
4. 空のオブジェクトを仲介として使用する
「プロトタイプを直接継承」には上記の欠点があるため、空のオブジェクトを使用できます。オブジェクト オブジェクトは仲介者として機能します。
var F = function(){};
F.prototype = Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor = Cat;
F は空のオブジェクトですメモリはほとんど必要としません。この時点では、Cat のプロトタイプ オブジェクトを変更しても、Animal のプロトタイプ オブジェクトには影響しません。
alert(Animal.prototype.constructor); // Animal
5. プロトタイプモードのカプセル化関数
使いやすくするために、上記のメソッドを関数にカプセル化します。
Function extend(Child, Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype.constructor = Child; uber = Parent .prototype; }
使用時のメソッドは次のとおりです
var cat1 = new Cat("Big Hair","Yellow"); cat1.species); // Animal
この拡張関数は、YUI ライブラリが継承を実装する方法です。
あと、ちょっと説明させてください。関数本体の最後の行
Child.uber = Parent.prototype;
は、親オブジェクトのプロトタイプ属性を直接指す子オブジェクトの uber 属性を設定することを意味します。これは子オブジェクトでチャネルを開くのと同じで、親オブジェクトのメソッドを直接呼び出すことができます。この行は、継承を完全にするためだけにここに配置されており、純粋にバックアップの目的で使用されています。
6. 継承のコピー
上記では、プロトタイプ オブジェクトを使用して継承を実装しています。また、考え方を変えて、純粋に「コピー」メソッドを使用して継承を実装することもできます。簡単に言えば、親オブジェクトのプロパティやメソッドをすべて子オブジェクトにコピーすれば、継承も実現できるのではないでしょうか?
まず、Animal の不変プロパティをすべてそのプロトタイプ オブジェクトに配置します。
コードをコピー
コードは次のとおりです: function Animal(){} Animal.prototype .species = "Animal";
次に、属性コピーの目的を達成するための関数を書きます。
コードをコピー
コードは次のとおりです。 Function extend2(Child, Parent) { var p = Parent.prototype;
var c = Child.prototype;
for (var i in p) {
c[i] =
c.uber = p;
}
この関数の機能は、親オブジェクトのプロトタイプ オブジェクトの属性を子オブジェクトのプロトタイプ オブジェクトに 1 つずつコピーすることです。
を使用する場合は、次のように記述します:
コードをコピー
まだ終わっていないので、パート 3「非コンストラクターの継承」を読み続けてください。
(終わり)