物件導向程式設計(3) 子父類與繼承

2022-09-04 20:51:10 字數 2548 閱讀 5395

因為物件導向,所以物件是很重要的儲存工具。和面向過程一樣,它也有變數名重複的風險,比如之前提到的原型汙染。為了一定程度上解決這個問題,引入了子父類和繼承的概念。

1.子父類

//父類

const getobj = function ()

getobj.prototype.getb = function ()

//另乙個類

const getobjj = function ()

//變成子類

getobjj.prototype = new getobj()

//子類原型單獨新增方法

getobjj.prototype.getc = function ()
let objj1 = new getobj()

如上述例子,getobj有個b屬性,那getobj的例項中肯定就有這個屬性,getobjj想要這個屬性,可以把自己的原型變成這個例項,getobjj就擁有這個屬性了.這種方式有以下特點:1.該屬性是別人的,不是它單獨賦值獲取的.比如getobjj.b=這種方式.2.原來擁有這個屬性的例項的原型本身並不會被它的操作影響.

那麼,獲得屬性的類就是子類,提供屬性的類就是父類.這種方式就叫做繼承.

2.繼承的方法

繼承有好幾種方法

(a:類式繼承:子類原型=父類例項

就是前面說明子父類用的方法,核心**

getobjj.prototype = new getobj()

但是這個方式有個缺陷,即當父親有多個孩子時,他會一視同仁.即乙個子類對繼承的屬性進行修改(非值傳遞)的時候會影響所有的子類

onst getobj = function () 

getobj.prototype.getb = function ()

const getobjj = function ()

getobjj.prototype = new getobj()

let objj1 = new getobjj()

let objj2 = new getobjj()

objj1.b.push('你') //直接往堆裡push

console.log('shyno', objj1.b, objj2.b) //['1','2','你'] ['1','2','你']

(b: 建構函式繼承:改變this指向

getobj.call(this, id)

簡單來說,就是建立子類的時候,在子類內部把父類的this在子類內部指向與子類

const getobj = function (id) 

getobj.prototype.getb = function ()

console.log('你')

const getobjj = function (id)

let objj1 = new getobjj(1) //建立子類例項的時候,子類有了自己的b=['1','2']

let objj2 = new getobjj(2) //有自己的b=['1','2']

objj1.b.push('你') //只修改了objj1的b,所以objj2的沒有碰到

console.log('shyno', objj1.b, objj2.b) //['1','2','你'] ['1','2']

但是,這種方法也有個問題,父類原型方法不會被繼承,即後續再往父類的原型上新增函式並不會被其子類繼承

objj1.getb() //沒法執行 is not a function

(c:組合式繼承:申明子類時將父類的this指向修改,同時子類的原型為父類例項

const getobj = function (id) 

}getobj.prototype.getb = function ()

console.log('你')

const getobjj = function (id)

getobjj.prototype = new getobj() //原型指向父類例項

let objj1 = new getobjj(1)

let objj2 = new getobjj(2)

objj1.b.push('你')

objj1.test() //test

objj1.getb() //getb

因為子類原型為父類例項,所以父類原型增加函式時,父類的例項就有相關函式,也就是子類原型有了相關元素,子類例項也就有了函式.

子類建構函式內部修改了this的指向,所以每次構造子類例項時,每個子類例項都有了自己獨立的屬性,互不干擾.

(d:原型式繼承和寄生式繼承:建構函式依賴建構函式,建構函式起點為物件

(e:寄生組合式繼承:寄生式加建構函式式

繼承對物件導向開發有重要意義,因為都在類中,故後續開發可通過繼承的方式實現公共復用,以及私有新增.即方便又靈活.

物件導向程式設計 繼承 類式繼承

定義 讓子類的原型指向父類的例項 1,宣告父類 function superclass superclass.prototype.getsupervalue function 2,宣告子類 function subclass 3,繼承父類 關鍵 subclass.prototype new supe...

java 學習筆記 物件導向(子父類)

子父類成員,變數 函式 建構函式 1 變數 如果子類中出現非私有的同名變數時,子類要訪問本類中的變數,用this。子類要訪問父類中的同名變數,用super。super的使用和this的使用幾乎一致。this代表的是本類物件的引用。super代表的是父類物件的引用 2 函式 當子類出現和父類一模一樣的...

物件導向程式設計 繼承

繼承是物件導向程式設計的主要特點之一。繼承,顧名思義就是子繼承父的所有。在面向程式設計中繼承的意思並沒變,子類繼承父類所擁有的屬性 方法。使用extends關鍵字使子類繼承父類,子類就可以自動復用父類的方法了 私有方法除外 並且繼承了父類的所有屬性。在子類例項化過程中子類的構造方法一定會去呼叫父類的...