物件導向與原型三

2021-08-01 17:10:16 字數 4333 閱讀 5054

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 ...