Javascriptの基礎知識の盲点のまとめ-継承


オリジナルチェーン継承メソッドでは、javascriptは別のクラスのインスタンスによって継承されます(実際には、別のオブジェクトのプロトタイプを1つのコンストラクタ関数のエンティティで上書きします).次のコードがあります.
TwoDShape.prototype = new Shape();
Triangle.prototype = new TwoDShape();
Shape()コンストラクタから直接継承するのではなく、new Shape()でエンティティを直接構築する必要があります.
この方法では、Shape()を変更してもTwoDShape()に影響しないことも保証されています.後者は前者が作成したエンティティのみを継承するためです.
上の操作では、オブジェクトのconstructorプロパティに悪影響を及ぼすため、constructorプロパティをリセットする必要があります.
TwoDShape.prototype.constructor = TwoDShape;
Triangle.prototype.constructor = Triangle;
プロトタイプチェーン継承をよりよく利用する方法は、クラス内の固定属性または共有属性をコンストラクタ関数の定義に置かず、プロトタイプに直接置くことです.これにより、newが新しいオブジェクトを作成するたびに、メモリ領域が多すぎず、効率が向上します.
function Shape(){                                                          function Shape(){}
    this.name =‘shape’;                《=》                       Shape.prototype.name =‘shape’;
}
ただし、エンティティ値ごとに異なるプロパティについては、コンストラクタ関数で定義する必要があります.
また、この方法を使用する場合は、継承関係の構築を完了してからプロトタイプオブジェクトを拡張する必要があります.そうしないと、継承はオブジェクトの拡張を上書きします.次のコードは、プロトタイプ内の属性値がオブジェクト内の特有の属性値を上書きします.
TwoDShape.prototype.name = ‘2D shape’;
TwoDShape.prototype = new Shape();//ここで名前をshapeに書き換えます
まとめ:再利用可能なプロパティとメソッドをプロトタイプに追加します.
 
上記の方法では、new Shape()エンティティを継承することにより、Shapeのプロパティがオブジェクト自身のプロパティに設定されます.このようなコードは再利用できません.次の「プロトタイプに直接継承」の方法で継承を実現できます.
TwoDShape.prototype = Shape.prototype;
この方法の利点は、オブジェクトが存在しない属性をクエリーすると、その上位に存在する属性がクエリーチェーンの長さを短縮することです.しかし、欠点は、子オブジェクトと親オブジェクトが同じオブジェクトから継承されているため、子オブジェクトがプロトタイプを変更すると、親オブジェクトもランダムに変更されます.たとえば、次のコードでは、子オブジェクトのname値が変更され、親オブジェクトも変更されます.
Triangle.prototype.name=‘Triangle’//そしてShapeのnameもTriangleになりました
上記の問題を解決するには、仲介として機能するために一時コンストラクタnew()を作成することを考えて、一時コンストラクタnew()を使用することができる.空の関数f()を作成し、そのプロトタイプを親コンストラクタに設定します.newF()を使用して、親オブジェクトのプロパティを含まないオブジェクトを作成したり、親オブジェクトprototypeプロパティからすべての情報を継承したりできます.
(実は仲介によって、子オブジェクトの修正を仲介コンストラクタに作用させ、親オブジェクトに影響を与えない)
var F = function(){};
F.prototype = Shape.prototype;
TwoDShape.prototype = new F();  
TwoDShape.prototype.constructor = TwoDShape;//コンストラクタの書き換え
この方法により,元のチェーンを維持した上で親オブジェクトの属性をサブオブジェクトの影響から解放することができる.
 
継承されたメソッドを関数extendにカプセル化
function extend(Child, Parent){
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor =Child;
Child.uber = Parent.prototype;
}

これにより、次のように継承できます.
extend(TwoDShape, Shape);
上記もYUIフレームワークの継承方法であり、YUIでは以下のように継承する.
YAHOO.lang.extend(Triangle, Shape);