JS 物件導向 繼承

2021-10-22 06:16:59 字數 3057 閱讀 9298

實現繼承是 ecmascript 唯一支援的繼承方式,而這主要是通過原型鏈實現的建構函式、原型和例項的關係:每個建構函式都有乙個原型物件,原型有乙個屬性(constructor)指回建構函式,而例項有乙個內部指標([[ prototype ]])指向原型。

/* 建構函式 */

function

father()

console.

dir(father)

;/*建構函式內有prototype: constructor指向father */

let fatherinstance =

newfather()

;console.

log(fatherinstance.__proto__)

;/* fatherinstance為father的例項:例項中有乙個指標指向father原型,輸出 */

實現繼承

function

father()

father.prototype.f =

"pf"

function

son(

)/* 現在想要son繼承father,已知son的建構函式的prototype: ,那麼只要改變son的建構函式的原型即可*/

/* son.prototype = father.prototype; 不能使用此方法改變son的原型,因為如此改變後,son的例項只能使用自己的屬性和father原型上的屬性,並沒有繼承father例項中的屬性,而且以後想要修改son的原型必定會破壞father的原型*/

son.prototype =

newfather()

;console.

log(s instanceof

father);

//true

console.

log(s instanceof

son)

;//true

/* 上面用到了instanceof來檢測原型與例項的關係 */

console.

log(s instanceof

object);

//true,找到s原型鏈上有和object一樣的建構函式

console.

log(s instanceof

father);

//true

console.

log(s instanceof

son)

;//true

father.prototype.

isprototypeof

(s);

//true ,s的原型鏈中包含father原型

son.prototype.

isprototypeof

(s);

//true ,s的原型鏈中包含father原型

object.prototype.

isprototypeof

(s);

//true ,s的原型鏈中包含father原型

function

father()

function

son(

)/* 繼承 */

son.prototype =

newfather()

;let s =

newson()

;s.fatherfood.

push

('雞腿');

let s2 =

newson()

;s2.fatherfood;

//["麵條", "雞蛋", "雞腿"],但是s2的fatherfood也改變

function

father

(name)

function

son(

)let s =

newson()

;s.fatherfood.

push

('雞腿');

let s2 =

newson()

;s2.fatherfood;

//["麵條", "雞蛋"],解決了共享記憶體問題

s instanceof

father

;//false

s instanceof

son;

//true

組合繼承(有時候也叫偽經典繼承)綜合了原型鏈和盜用建構函式,將兩者的優點集中了起來。基本的思路是使用原型鏈繼承原型上的屬性和方法,而通過盜用建構函式繼承例項屬性

function

father

(name)

function

son(

)son.prototype =

newfather()

;/* 繼承父方法 */

let s =

newson()

;s.fatherfood.

push

('雞腿');

let s2 =

newson()

;s2.fatherfood;

//["麵條", "雞蛋"],解決了共享記憶體問題

/* 寄生式顧名思義,在乙個函式內部做了某些操作 */

function

inheritprototype

(father,son)

function

father

(name)

father.prototype.ff=

function()

function

son(

)inheritprototype

(father,son)

;

JS物件導向 繼承

參考博文 一 物件導向的繼承 1 解析 在原有物件的基礎上,略作修改,得到乙個新的物件,並且不影響原有物件的功能 2 如何新增繼承 拷貝繼承 屬性 call 方法 for in 繼承 子類不影響父類,子類可以繼承父類的一些功能 復用 屬性的繼承 呼叫父類的構造1函式 call 方法的繼承 for i...

js 物件導向 繼承

繼承 將方法的定義放在建構函式中,每建立乙個新物件,都會重複建立該方法一模一樣的副本,浪費記憶體。解決 如果多個子物件都要使用乙個相同的方法時,應該把這個方法放在一種原型物件中,建構函式中不再包含方法定義。原型物件 乙個型別中,專門為所有子物件集中儲存共有方法的物件。同一型別下多個子物件需要用乙個共...

js物件導向 繼承

原型模式與建構函式組合 function person name,age,job person.prototype sayjob function 定義singer類,並指定job為singer function singer name,age,song 每次呼叫singer建構函式都會把singe...