什麼是繼承?
乙個原本沒有某些方法和功能的物件,用過一些方法拿到另乙個物件的屬性和方法
建構函式的繼承:
function
fn(name)
}var obj1 =
newfn
("aaa");
var obj2 =
newfn
("bbb");
obj1.
show()
obj2.
show
()
function
father
(skill)
}function
son(abc)
var f =
newfather
("絕世木匠」)
;var s =
newson
("一般木匠");
f.show()
s.show()
;//優點:建立子類例項時,可以向父類的構造器傳參;
//缺點:只能繼承構造器中定義的屬性和方法,不能繼承原型上定義的屬性和方法
function
father
(name, age)
function
child1
(name, age)
function
child2
(name, age)
var first=
newchild1
('one',11
);var second=
newchild2
('two',22
);console.
log(first.category ,first.name,first.age)
// child1,one,11
console.
log(second.category ,second.name,second.age)
//child2,two,22
原型物件繼承:繼承原型
缺點:只能繼承原型,不能傳參
優點:簡單 方便 可以繼承原型上的屬性和方法
使原型prototype進行深拷貝
function
parent
(n) parent.prototype.
skill
=function()
function
child
(n)// 注意:物件的深淺拷貝
// child.prototype = parent.prototype;
for(
var i in parent.prototype)
// child.prototype.skill = function()
var p =
newparent
("大老王");
console.
log(p)
p.skill()
;var c =
newchild
("小老王");
console.
log(c)
c.skill()
;
原型鏈繼承:
通過給子設定例項的方式 給子新增一層原型鏈的方式
function
supertype()
supertype.prototype.
fun=
function()
;function
subtype()
//繼承了supertype
subtype.prototype =
newsupertype()
;//優點:既能繼承原型又能繼承建構函式
//缺點:複雜 不方便傳參
混合繼承:function
father
(skill,id)
father.prototype.
show
=function()
function
son(
)//如果不做son的原型繼承father的原型,此時會報錯:son.show is not a function
for(
var i in father.prototype)
son.prototype.
show
=function()
var f =
newfather
("專家級鐵匠"
,"father");
var s =
newson
("熟練級鐵匠"
,"son");
f.show()
; s.
show()
;//優點:方便傳參 多繼承
//缺點:複雜
es6 class繼承:
class
child
extends
parent
}//建構函式 + 原型鏈
//extends 關鍵字繼承父級屬性的方法
//優點:簡單方便易操作 語法層面繼承 屬性和方法都能繼承 引數很好處理
//缺點:相容性 ie5
//super關鍵字既可以當做函式使用,也可以當做物件使用
//super作為函式呼叫時 代表父類建構函式 es6要求,子類的建構函式必須執行乙個super
//super作為物件使用時 在普通方法中指向父類的原型物件,在靜態方法中指向物件
檢測兩個物件之間是否存在繼承關係
fn.prototype.isprototypeof(f)檢視fn的prototype物件是否是f的原型
f instanceof fn 檢視 f 物件是否是建構函式 fn 的例項
JS物件繼承的一些方法
由於引用型別 陣列 物件 是按位址傳遞,直接拷貝是淺拷貝,即修改拷貝後的變數,原變數也會改變。有時需要深拷貝乙個物件,這時就需要遍歷徹底複製,使原物件和拷貝物件完全脫離關係。建立例項物件 var o var a object.create o a.color blue a.arr.push 2 co...
繼承的一些注意點
1.子類覆蓋的方法不能丟擲比父類方法更多的異常。2.父類靜態方法不能被子類非靜態方法覆蓋。3.父類非靜態方法不能被子類靜態方法覆蓋。4.private方法不能被覆蓋。5.父類非抽象方法可以被覆寫為抽象方法。6.在靜態方法或靜態的 塊中不能使用super關鍵字。7.成員變數屬於靜態繫結。class a...
JS繼承的一些見解
js在es6之前的繼承是五花八門的。而且要在專案中靈活運用物件導向寫法也是有點彆扭,更多的時候還是覺得面向過程的寫法更為簡單,效率也高。久而久之對js的繼承每隔一段時間就會理解出現困難。所以這次我要把對物件的理解寫下來,這樣應該就深刻一點了。我們先來看看乙個物件是怎麼生成的 三種建立物件的方法 va...