JavaScriptの原型継承

Java(登録商標)、C ++などの伝統的なクラスベースの言語では、継承された性質は、既存のクラスを拡張したもので、新しいサブクラスを生成します。

言語のこのような厳格なゾーン分類インスタンスなので、実際に継承された拡張機能のタイプです。しかし、JavaScriptのおかげ原型継承は、我々はこのタイプが存在しないという理由だけで、クラス、クラスに直接拡張することはできません。

しかし、アプローチはまだそこにあります。私たちは、最初に確認Studentのコンストラクタを:

関数学生(小道具){
     この .nameの= props.name || 「名前」; 
} 

Student.prototype.hello = 関数(){ 
    アラート( 'こんにちは、' + この .nameの+ '!' )。
}

今、私たちは、に基づいて欲しいStudent引き出さPrimaryStudent、あなたが定義することができますPrimaryStudent

関数PrimaryStudent(小道具){
     // コンストラクタ学生は、この変数をバインド呼び出し: 
    Student.call(この、小道具);
     この。.grade = || props.grade 1 ; 
}

しかし、呼び出すStudentコンストラクタは継承されたという意味ではありませんStudentPrimaryStudentプロトタイプオブジェクトが作成されます。

新しい PrimaryStudent()----> PrimaryStudent.prototype ---->のObject.prototype ----> はnull

私たちは、次のようにチェーンが改正プロトタイプする方法を見つける必要があります。

新しい PrimaryStudent()----> PrimaryStudent.prototype ----> Student.prototype ---->のObject.prototype ----> はnull

このように、右側の継承関係のプロトタイプチェーン。新基づきPrimaryStudent作成されたオブジェクトを呼び出すだけでなく、PrimaryStudent.prototype定義された方法を、あなたも呼び出すことができますStudent.prototype定義されたメソッドを。

あなたはそれを行うには、最もシンプルで、粗な方法を使用する場合

PrimaryStudent.prototype = Student.prototype。

それは十分ではありません!このような場合は、場合PrimaryStudentStudent共有プロトタイプオブジェクトを、また定義することPrimaryStudentやって?(ただ、彼の父親の息子のように、彼は、彼の体の特性を維持するために彼の父の仕事を助けることができますが、息子指定された店を出産し、ライブに行く、彼は私の父を助けるためにやらせている、と生まれた息子がやっていること... )

我々は正しいプロトタイプチェーン、この中間点にプロトタイプオブジェクトを達成するための中間目標を使用する必要がありますStudent.prototypeこれを達成するために、基準チャネルイエコード、中間の空の関数オブジェクトができ(JSON発明はダグラスということである)Fを達成すること。

// PrimaryStudentコンストラクタ:
関数PrimaryStudent(小道具){ 
    Student.call(この、小道具);
     この .grade = || props.grade 1 ; 
} 

// ヌル関数F:
関数F(){ 
} 

// Fを入れプロトタイプのポイントStudent.prototype: 
F.prototype = Student.prototype; 

// PrimaryStudentは、F、Fプロトタイプオブジェクトのポイントを正確にStudent.prototypeオブジェクトの新しいプロトタイプを指すように: 
PrimaryStudent.prototype = 新しい新しいFを(); 

// 置くPrimaryStudentプロトタイプのコンストラクタはPrimaryStudentを修復するには: 
PrimaryStudent.prototype.constructor = PrimaryStudent; 

// メソッドを定義するPrimaryStudentプロトタイプ(つまり、新しいF()オブジェクト)を続行します。
= PrimaryStudent.prototype.getGradeの関数(){
     戻り 、この.gradeを; 
}; 

//は暁の作成:
VAR暁= 新しい新しいPrimaryStudent({ 
    名: 'ボブ' 
    グレード: 2 
}); 
xiaoming.name; // 'ボブ 
xiaoming.grade; // 2 

// プロトタイプ検証: 
暁明.__ proto__ === PrimaryStudent.prototype; // trueに 
暁明.__プロト__.__ proto__ === Student.prototype; // trueに

// 検証継承: 
暁明のinstanceofをPrimaryStudent; //  
暁明のは、instanceof学生。// 

そのようなステップが少し面倒継承し、それができることが分かっアップパッケージ化

後継者とこのアクション場合inherits()、機能パッケージ一緒に、あなたはまた、非表示にすることができますF定義し、コードを簡素化:

関数は、継承(子供、親){
     VARの F = 関数(){}。
    F.prototype = Parent.prototype。
    Child.prototype = 新しいF(); 
    Child.prototype.constructor = 子供; 
}

このinherits()関数は、再利用することができます。

関数学生(小道具){
     この .nameの= props.name || '名前破る' ; 
} 

Student.prototype.hello = 機能(){ 
    警告( 'こんにちは、' + この .nameの+ '!' ); 
} 

関数PrimaryStudent(小道具){ 
    Student.call(この、小道具);
     この .grade = || props.grade 1 ; 
} 

// プロトタイプ継承チェーン:
(PrimaryStudent、学生)を継承; 

// 他の方法PrimaryStudentプロトタイプにバインド: 
PrimaryStudent。 = prototype.getGradeの関数(){
     戻り 、これを。グレード; 
}。

概要

JavaScriptはプロトタイプ実装の継承であります:

  1. 新しいコンストラクタを定義し、内部で使用されるcall()コンストラクタの希望「継承」を呼び出し、バインドthis

  2. 中間関数によるFプロトタイプ継承鎖、好ましくは、カプセル化によってinherits補完機能と

  3. 新しいプロトタイプのコンストラクタに新しいメソッドを定義し続けます。

 

おすすめ

転載: www.cnblogs.com/fqh123/p/10963441.html