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