繼承 次日

繼承是面向對象的一個核心概念,其餘主要面向對象的繼承主要靠兩種方式實現繼承 一種是繼承 另外一種是接口實現 javascript

一.原型繼承java

  function Box(){

           this.name=‘lll’;                       //被繼承的函數叫作超類型(父類型 基類)

}

   function Desk(){                              //繼承的函數叫作子類型(子類,派生類)

                  this.age=100;
}


Desk.prototype=new Box();

var desk=new Desk();

alert(desk.name);

function Table(){

this.address='lol';
}

Table.prototype=new Desk();

var table=new Table();
alert(table.name);

 原型繼承示意圖 

Desk 的原型得到是Box()的實例和原型  以此類推函數

   就近元則:先查詢實例有沒有該屬性 ,而後在查找原型裏面是否還有該屬性this

alert(desk instanceof Box)     true

  

二.借用構造函數(對象冒充函數)prototype

解決引用共享和超類型傳參數的問題指針

functon Box(name,age){
this.name=name;
this.age=age;
 //this.family=['哥哥','姐姐','弟弟']
}

Box.prototype.family='家庭';
function Desk(){

Box.call(this,'lll',100);

}

var desk=new Desk();
alert(desk.name);
alert(desk.family) 對象冒充解決了共享問題和傳參數的問題 可是隻能繼承實例的問題 不能繼承原型 方法放在構造裏,浪費空間,每次實例化都分配地址

 


三.組合繼承(對象冒充繼承和原型繼承)對象

functon Box(name,age){
this.name=name;
this.age=age;
 //this.family=['哥哥','姐姐','弟弟']
}

Box.prototype.run(){

  return this.name+this.age;

}



function Desk(){

Box.call(this,'lll',100);

}


Desk.prototype=new Box();


var desk=new Desk();
alert(desk.name);
alert(desk.family)  
alert(desk.run())

  


四.原型繼承blog

function obj(0){                                     //中轉函數

   function F(){}     用來存儲傳遞過來的對象
  F.prototype=o;
  return  new F();

}




var box={

     name:'lll';
     age:100;
family:['哥哥' ,'姐姐'] } var box1=obj(box) box1 等於new F(); alert(box1.family);
box1.push('弟弟')
alert(box1.family);

var box2=obj(box);
alert(box2.family); 引用類型屬性共享了

  

五.寄生式繼承(原型加工廠模式)繼承

function obj(o){                                     //中轉函數

   function F(){}     用來存儲傳遞過來的對象
  F.prototype=o;
  return  new F();

}

  function create(o){                   //寄生式繼承

var f=obj(o);
f.run=function(){

return this.name
}
return f;
} var box={ name:'lll'; age:100; family:['哥哥' ,'姐姐'] }
var box1=create(box);
alert(box1.name)

  


 

六寄生組合繼承接口

function create(box, desk) {
	var f = obj(box.prototype);
	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('Lee', 100);
alert(desk.run());
alert(desk.constructor);
相關文章
相關標籤/搜索