言うまでもなく、親クラスのコンストラクタをサブクラスで呼び出すこのメソッドの方が分かりやすいです。さらに、この方法の最大の利点の 1 つは、構造継承によって多重継承を実現できることです。
のコードを確認してください。
function A()
{ }
function B()
{ }
function C()
{
this.father=A;
this.father();
delete this.father;
this .father=B;
this.father();
this.father;
}
を削除します
しかし、この方法にはあれこれの欠点もあります:
オブジェクト指向に詳しい人のために、次の C# コードを見てみましょう:
classProgram
{
staticvoid Main(string [] args)
{
B b=newB();
bool temp = (typeof(A)).IsInstanceOfType(b);
Console.WriteLine(temp);
}
}
classA
{
public A()
{
}
}
classB : A
{
public B( )
{
}
}
結果はどうなりましたか? b はもちろん A のインスタンスです:
ただし、構造継承を使用する上記の Javascript コードでこのテストを実行してみましょう:
function A()
{ }
function B()
{ }
function C()
{
this.father=A;
this.father();
delete this.father;
this .father=B;
this.father();
delete this.father;
}
var c=new C();
alert(c instanceof A);
しかし、結果は私たちが想像していたものとは異なりました:
実際、説明は簡単です。構造継承は、親クラスのコンストラクター メソッドを呼び出して親クラスの属性をコピーするだけで、他には何も行わないため、多くのマテリアルではこの継承メソッドを継承とは呼びません。
欠点を確認しながら、利点も覚えておいてください。多重継承をサポートしています。
C# の継承を見てみましょう。この継承には 2 つの最も典型的な違いがあることがわかります。C# は多重継承をサポートしていないこと、もう 1 つは上で述べた構造継承の欠点です。そこで、プロトタイプ継承と呼ばれる新しい継承方法が登場しました。
名前を見ると、プロトタイプ継承はプロトタイプの特性を利用して継承を実現していることが大まかに理解できます。これは、JavaScript で最も一般的な継承メソッドです。プロトタイプが理解できない場合は、私の別の記事「プロトタイプで遊ぶ - プロトタイプ」を参照してください。
まずコードを見てみましょう。ここでは、「The Return of the Javascript King」からコードの一部を借用しています。
function Point(dimension)
{
this.dimension=dimension;
this.Test=function(){
alert("Success");
}
}
function Point2D(x,y)
{
this.x=x;
this.y=y;
}
Point2D.prototype=new Point(2);
var p=new Point2D(3,4) ;
p.Test();
テストに合格しました。 Point2D が親クラスのメソッドを継承していることがわかります。インスタンスをもう一度見てみましょう。
alert(ポイントのインスタンス);
成功!さて、プロトタイプの継承を分析しましょう:
プロトタイプ継承の利点については詳しく説明しません。構造がシンプルで理解しやすく、インスタンス化も可能です。しかし、彼の欠点も同様に明白です。前回の記事の動物、人物、少女の例をまだ覚えていますか?これを実現するために、プロトタイプの継承を使用します。
関数 Animal()
{
this.Run=function(){alert("走れる");};
}
関数 People(name)
{
this.Say=function(){alert("私の名前は " this.name);}
}
People.prototype=new Animal();
function Girl(name, age)
{
this.age=age;
this. Introduction=function(){alert("私の名前は " this.name " です。私は " this.age です);}; >}
Girl.prototype=new People(???);
赤い太字部分のコード行に注目してください。People は Girl のプロトタイプなので、People を初期化するときに name パラメータを渡す必要がありますが、各 Girl の名前は異なるため、プロトタイプの継承が行われます。使用しない場合: プロトタイプの継承段階では、親クラス オブジェクトの初期化にどのパラメーターを使用するかを決定できません。状況 2: 非常に単純です。各クラスはプロトタイプを 1 つだけ持つことができます。これは、プロトタイプの継承を多重継承に使用できないことを意味します。これは良いことでもあり、悪いことでもあります。理由:
Java や C# などのオブジェクト指向言語は元々多重継承をサポートしておらず、多重継承はオブジェクト指向と矛盾すると考えられている
複数のインターフェースを実装することはできません!
今日はここまでです。要約すると、プロトタイプ継承は構造継承のいくつかの問題を解決し、いくつかの新しい問題をもたらします。一般に、プロトタイプ継承は最も広く使用されている継承方法であり、JavaScript 文法で継承を実装する真の方法でもあります。