「JavaScript」――対象への継承


継承とは、対象のうちの比較的核心的概念である.他の正統派の対象言語はいずれも2つの方式で継承を実現します.一つはインターフェースで実現します.一つは継承です.ECMAScriptは継承のみをサポートしており、インターフェースの実現をサポートしていません.継承はプロトタイプチェーンによって完成されます.JavaScriptでの継承は、いくつかの種類に分けられており、問題の発生に伴って継承の方法もアップグレードされました.プロトタイプチェーンの継承だけでなく、組み合わせの継承、プロトタイプの継承、寄生式の継承、寄生型の組合せの継承などがあります.彼らは異なる問題の出現に伴って現れました.それぞれにこれらの継承方法を紹介します.
     1、原型チェーン継承   
<span style="font-family:KaiTi_GB2312;font-size:18px;">function Box() { //Box   
this.name = '  ';
}
function Desk() { //Desk   
this.age = 100;
}
Desk.prototype = new Box(); //Desk     Box,    ,    
var desk = new Desk();
alert(desk.age);
alert(desk.name); //        </span>
     短所:プロトタイプチェーンは、実用化後の初期値を引き継ぐのと同じで、変更できないし、多重化もできないので、この問題を解決するために、プロトタイプチェーン+借用構造関数を組み合わせて継承します.
     2、組合せ相続(プロトタイプチェーン+借用構造関数)
<span style="font-family:KaiTi_GB2312;font-size:18px;">
function Box(age){
	this.name=['   ','   '];
	this.age=age;
}

Box.prototype.run=function(){
	return this.name+'    '+this.age;
}

function Desk(age){
	Box.call(this,age);                           //    ,          ,   Box             Desk(),          。
}

// var desk=new Desk(20);
// alert(desk.name+'    ???');                //         ,       ???    Desk()           。
// alert(desk.run());                                 //         ,run()         。

Desk.prototype=new Box();                            //       , Box()              Desk()
var desk=new Desk(20);
alert(desk.name+'    ???');                  //       ,       ???
alert(desk.run());                                  //       ,        20
</span>
     プロトタイプチェーンの継承は、着参と共有の問題を補完していますが、欠点は、オブジェクトの一例を実装するたびに、スーパータイプBox()を2回呼び出す必要があります.寄生グループの継承はこの問題を解決することができます.寄生グループの後継者は、まず原型式の継承について話します.
     3、原型式継承
<span style="font-family:KaiTi_GB2312;font-size:18px;">//
function obj(o) { //         
function F() {} //        
F.prototype = o; //                
return new F(); //             
}

var box = { //     
name : 'Lee',
arr : ['  ','  ','  ']         //      ,       
};

var box1 = obj(box);               //  
alert(box1.name);                   //  Lee
box1.name = 'Jack';              // name  jack
alert(box1.name);                  //  Jack

alert(box1.arr);
box1.arr.push('  ');            //arr       ,             。
alert(box1.arr);


var box2 = obj(box);  //  
alert(box2.name);      //  Lee,   Jack,    ,       。
alert(box2.arr);           //    ,  ,  ,  ,    ,       。</span>
     このような継承は、プロトタイプによって、既存のオブジェクトに基づいて新しいオブジェクトのインスタンスを作成するとともに、カスタムタイプを作成する必要はありません.
     4、寄生式継承(原型継承+工場方法モード)
<span style="font-family:KaiTi_GB2312;font-size:18px;">function obj(o){
	function F(){}
	F.prototype=o;
	return new F();
}

function create(o){
	f=obj(o)
	f.run=function(){
		return this.family;
	}
	return f;
}

var box={
	name:'   ',
	age:22,
	family:['    1']
}

var box1 = create(box); //  
alert(box1.name);           //    box  ,      
box1.name='   ';     //      name       ,        name
alert(box1.name);          //     
alert(box1.run());            //        1,
box1.family.push('    2');//        1,    2,        family
alert(box1.run());

var box2 = create(box);  //  
alert(box2.name);            //    box  ,               
alert(box2.run());  </span>
     寄生式継承はプロトタイプ+工場モードを結合し、パッケージ作成のためのプロセスである.
     5、寄生グループが引き継ぎ、複数回の実用化を解決する場合、複数の超種問題を呼び出します.  
<span style="font-family:KaiTi_GB2312;font-size:18px;">//    
function obj(o){
	function F(){}
	F.prototype=o;
	return new F();
}
//    
function create(box,desk){
	f=obj(box.prototype);      //     Box     
	f.constructor=desk;          //      
	desk.prototype=f;
}

function Box(name,age){
	this.name=name;
	this.age=age;
}

Box.prototype.run=function(){
	return this.name+this.age;
}

function Desk(name,age){
	Box.call(this,name,age);     //      ,            。
}
//           

create(Box,Desk);   //  Desk.prototype=new Box();

var  desk=new Desk('  ',25)
alert(desk.run()); //    ,25</span>
    結び目
    これらの継承方法は全部紹介されました.毛皮の毛だけを知っていますが、プロジェクトの中の本当の役割はたとえプロジェクトを鍛えている時にしか見つけられないとしても、今は何を言っても口の利き方です.また本物の技術がある前に、これらの理論知識も必要です.プロジェクトをさらに昇華させます.