Class多種繼承方式

2021-10-24 04:10:48 字數 4174 閱讀 6740

// class 的多種繼承方式

// 繼承1 -- 原型鏈繼承:子類的prototype為父類的例項

function

person()

person.prototype.

printname

=function()

function

student()

student.prototype =

newperson()

// -- student.prototype = person.prototype : 子類只能繼承父類原型上的屬性和方法 不能繼承父類上的屬性和方法

var stu =

newstudent()

stu.

printname()

// student

// 原型鏈繼承的弊端: 1. 在父類建構函式中定義的引用型別資料時,繼承子類乙個例項改變該值後,所有繼承子類例項該值都改變 (屬性共享)

// 2. 在建立子類例項時,不能向建構函式傳遞引數

stu.arr.

push(3

)console.

log(stu.arr)

// [1, 2, 3]

var stu2 =

newstudent()

console.

log(stu2.arr)

// [1, 2, 3]

function

stu(

)var s =

newstu()

stu.prototype =

newperson()

console.

log(s.arr)

// 繼承2 -- 借助建構函式: 在子類中通過call方法來改變父類建構函式的this指向,對建構函式內屬性方法的複製

function

person()

}person.prototype.

printname

=function()

function

student()

var stu =

newstudent()

console.

log(stu.name)

// "zrz"

console.

log(stu.age)

// 12

// stu.printname() // stu.printname is not a function

stu.

printage()

// 12

stu.arr.

push(3

)console.

log(stu.arr)

// [1,2,3]

var stu2 =

newstudent()

console.

log(stu2.arr)

// [1,2]

// 借助建構函式實現類的繼承: 解決了原型繼承中引用資料 「 屬性共享 」 的問題,可以傳遞引數;

// ------ 但也存在著弊端:弊端一:定義在父類原型上的方法對子類不可見,只有定義在父類建構函式裡的方法才能被子類繼承(只繼承了父類建構函式上的屬性和方法,對父類原型上的屬性和方法沒有繼承)

// ------ 弊端二:繼承出來的例項只是子類的例項,不是父類的例項(參照上一點:父類原型上的屬性和方法並不可用)

// ------ 弊端三:無法實現函式的復用,子類是對父類建構函式屬性和方法的複製,每個子類例項都有各自的屬性和方法,這些方法是公用的,沒能實現復用

// 繼承3 -- 組合繼承: 將前面兩種方法結合在一起:原型鏈繼承法來繼承原型上的屬性和方法,利用建構函式實現對建構函式上屬性和方法的繼承

function

person

(name)

person.prototype.

printname

=function()

function

student

(name,age)

//繼承方法

student.prototype =

newperson()

// 第一次呼叫父類建構函式

student.prototype.constructor = student // 修復constructor指向

student.prototype.

printage

=function()

var stu =

newstudent

("rrr",12

)console.

log(stu.name)

//"rrr"

stu.

printname()

//"rrr"

stu.

printage()

//12

// 組合繼承: 避免了前兩種方法的弊端

// 弊端: 每次都會呼叫兩次父類的建構函式

// 繼承4 -- 原型式繼承: 使用object.create 根據乙個物件來建立另外乙個物件

var person =

var stu = object.

create

(person,})

stu.arr.

push(3

)console.

log(stu.name)

//"eee"

var stu2 = object.

create

(person)

console.

log(stu2.arr)

//[1,2,3]

// 原型式繼承: 不需要建立建構函式,可以讓兩個物件保持一致

// 弊端:但是仍然存在與原型鏈繼承一樣的問題:「 屬性共享 」

// 繼承5 -- 寄生式繼承: 在原生式繼承的基礎上改進,根據例項物件建立新的物件,並為新物件新增方法(將原型式繼承過程封裝成函式,並在函式內為建立物件新增方法)

function

createanother

(person)

return another

}var person =

var another =

createanother

(person)

another.

printname()

//"zrz"

// 與建構函式相似:方法都定義在建構函式中,每建立一次例項,都需要建立一次方法, 不能做到函式復用

// 繼承6 -- 寄生組合式繼承: 最理想有效的繼承方式(解決了組合繼承中呼叫兩次父類建構函式的缺點)

function

person

(name)

person.prototype.

printname

=function()

function

student

(name, age)

student.prototype = object.

create

(person.prototype)

//與組合式繼承的主要區別:object.create()方法建立了__proto__屬性是person.prototype的空物件,使得student的prototype指向它

student.prototype.constructor = student // 糾正constructor指向

student.prototype.

printage

=function()

var stu =

newstudent

("eee",11

)stu.

printname()

// "eee"

stu.

printage()

// 11

// object.create(obj) 方法的內部實現: 返回以obj為原型的建構函式的例項

得到Class的多種方式

在object類中定義了以下的方法,此方法將被所有子類繼承 public final class getclass 物件照鏡子後可以得到的資訊 某個類的屬性,方法,構造器,某個類到底實現了哪些介面。對於每個類而言,jre都為其保留了乙個不變的class型別的物件。乙個class物件包含了特定某個結構...

繼承的多種方式

常用的繼承方法 1.原生繼承 抽取共同點 人類 function people name,age,people.prototype.say function people.prototype.breath function 學生類 function student name,age,studentn...

C 的多種繼承方式

繼承的意義在於 可以復用,在原有的基礎上新增新功能就變成了新一代產品了 就像移動 發展史一樣,從大哥大到現在的智慧型手機,代代相傳添磚加瓦,單車變摩托,平房變別墅。究其本質是不變的 繼承也是為了多型服務的。class的繼承分為單繼承,多繼承,菱形繼承,虛擬繼承,菱形虛擬繼承。單繼承 單繼承就是子類d...