function
box()
function
desk
()//通過原型鏈整合,超型別例項化後的物件例項,賦值給子類的原型屬性
//new box()會將box構造裡的資訊和原型裡的資訊都交給desk
desk.prototype=new box();//desk繼承box,通過原型形成鏈條
var desk=new desk();
alert(desk.name);//得到被繼承的函式列印出lee
原型鏈繼承流程圖
alert(box instanceof desk);//false 很明顯父型別不從屬於子型別,所以返回false
//得出結論:子型別從屬於自己或者其他的超型別
繼承也有之前問題,比如字面量重寫原型會中斷關係,使用引用型別的原型,並且子型別還無法給超型別傳遞引數
原型繼承缺點:①無法傳參②如果有共用的方法沒辦法共享
為了解決引用共享和超型別無法傳參的問題,我們採用一種叫借用建構函式的技術,或者成為物件冒充(偽造物件、經典繼承)的技術來解決這兩種問題。
物件冒充繼承優點:解決了傳參為題和共享問題
function
box(name,age)
function
desk
()var desk=new desk('lee',100);
alert(desk.name);//lee
給box
方法新增乙個原型屬性
function
box(name,age)
box.prototype.family=['哥哥']
function
desk
()var desk=new desk('lee',100);
alert(desk.family);//undefined
給box
方法新增乙個屬性
function
box(name,age)
function
desk
()var desk=new desk('lee',100);
alert(desk.family);//['哥哥']
desk.family.push('弟弟');
alert(desk.family);//['哥哥','弟弟']
var desk2=new desk('lee',100);
alert(desk.family);//['哥哥']
注意:物件冒充只能繼承建構函式裡的資訊
注意:引用型別放在建構函式裡就不會被共享
在box
中新增乙個run
方法
function
box(name,age)
}function
desk
()
function
box(name,age)
}
function
box(name,age)
box.prototype.run=function
()function
desk
()var desk=new desk('lee' ,100);
alert(desk.run());//無法訪問到run這個方法。
物件冒充繼承缺點:物件冒充繼承無法繼承原型裡面的屬性和方法,只能繼承建構函式中的屬性和方法
借用建構函式雖然解決了剛才兩種問題,但是沒有原型復用無從談起。需要用原型鏈+借用建構函式的模式這種模式稱為組合繼承
缺點:超型別會被呼叫兩次,要解決這個問題需要用到寄生組合繼承
function
box(name,age)
box.prototype.run=function
()function
desk
()desk.prototype=new box();//原型鏈繼承 第二次呼叫
var desk=new desk('lee' ,100);
alert(desk.run());//lee100
這種模式其實就是原型鏈繼承,只不過換了一種寫法
優點:這種繼承借助原型並基於已有的物件建立新物件,同時還不必因此建立自定義型別。
缺點:還是會有引用型別會被共享的問題
function
obj(o) //建立乙個建構函式
f.prototype = o;//把字面量函式賦值給建構函式的原型
return
new f();//最終返回出例項化的建構函式
}var box = ;
//下面來測試引用型別是否會被共享
var box1 = obj(box);//傳遞
alert(box1.name);
box1.name = 'jack';
alert(box1.name);
alert(box1.arr);
box1.arr.push('父母');
alert(box1.arr);
var box2 = obj(box);//傳遞
alert(box2.name);
alert(box2.arr);//引用型別共享了
function
obj(o)
f.prototype = o;
return
new f();
}//相當於原型鏈繼承
function
f(){}
f.prototype=new
object();
//臨時中轉函式
function
obj(o)
f.prototype = o;
return
new f();
}//寄生函式
function
create
(o)var box=
var box1=create(box);
alert(box1.name)//lee
在create
方法中增加乙個run方法
//臨時中轉函式
function
obj(o)
f.prototype = o;
return
new f();
}//寄生函式
function
create
(o) return f;
}var box=
var box1=create(box);
alert(box1.run())//lee
//臨時中轉函式
function
obj(o)
f.prototype = o;
return
new f();
}//寄生函式
function
create
(box,desk)
function
box(name,age)
box.prototype.run=function
()function
desk
(name,age)
//通過寄生組合繼承來實現繼承
create(box,desk);
var box=
物件導向與原型2 原型
1.我們建立的每個函式 或稱建構函式或物件 都有乙個 prototype 原型 屬性,這個屬性是乙個物件 這個物件下有個prototype屬性,而這個屬性其實是另外乙個物件的引用,這個屬性就是乙個物件 它的用途是 包含可以由特定型別的所有例項共享的屬性和方法 prototype共享放到其中的屬性和方...
物件導向的原型與繼承
1.為什麼需要原型 構造器建立物件的時候,實際上會有成員重複 如果使用 構造器 this.方法名 function 方式建立物件.那麼每乙個物件 對應的方法就會重複.解決辦法就是讓這個方法 函式 共享 將函式寫到外面,那麼 person 在初始化物件的時候就不會再建立乙個函式了.只需要將 外面的函式...
物件導向與原型(一)之建立物件
一 工廠模式 為了解決例項化物件產生大量重複的問題。其 格式如下 function createobject name,age returnobj var box1 createobject ji 10 第乙個例項 var box2 createobject jack 20 第二個例項 alert ...