Java(登録商標)、C ++などの伝統的なクラスベースの言語では、継承された性質は、既存のクラスを拡張したもので、新しいサブクラスを生成します。
言語のこのような厳格なゾーン分類インスタンスなので、実際に継承された拡張機能のタイプです。しかし、JavaScriptのおかげ原型継承は、我々はこのタイプが存在しないという理由だけで、クラス、クラスに直接拡張することはできません。
しかし、アプローチはまだそこにあります。私たちは、最初に確認Student
のコンストラクタを:
関数学生(小道具){ この .nameの= props.name || 「名前」; } Student.prototype.hello = 関数(){ アラート( 'こんにちは、' + この .nameの+ '!' )。 }
今、私たちは、に基づいて欲しいStudent
引き出さPrimaryStudent
、あなたが定義することができますPrimaryStudent
:
関数PrimaryStudent(小道具){ // コンストラクタ学生は、この変数をバインド呼び出し: Student.call(この、小道具); この。.grade = || props.grade 1 ; }
しかし、呼び出すStudent
コンストラクタは継承されたという意味ではありませんStudent
、PrimaryStudent
プロトタイプオブジェクトが作成されます。
新しい PrimaryStudent()----> PrimaryStudent.prototype ---->のObject.prototype ----> はnull
私たちは、次のようにチェーンが改正プロトタイプする方法を見つける必要があります。
新しい PrimaryStudent()----> PrimaryStudent.prototype ----> Student.prototype ---->のObject.prototype ----> はnull
このように、右側の継承関係のプロトタイプチェーン。新基づきPrimaryStudent
作成されたオブジェクトを呼び出すだけでなく、PrimaryStudent.prototype
定義された方法を、あなたも呼び出すことができますStudent.prototype
定義されたメソッドを。
あなたはそれを行うには、最もシンプルで、粗な方法を使用する場合:
PrimaryStudent.prototype = Student.prototype。
それは十分ではありません!このような場合は、場合PrimaryStudent
とStudent
共有プロトタイプオブジェクトを、また定義すること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はプロトタイプ実装の継承であります:
-
新しいコンストラクタを定義し、内部で使用される
call()
コンストラクタの希望「継承」を呼び出し、バインドthis
。 -
中間関数による
F
プロトタイプ継承鎖、好ましくは、カプセル化によってinherits
補完機能と -
新しいプロトタイプのコンストラクタに新しいメソッドを定義し続けます。