js繼承的概念
js里常用的如下兩種繼承方式:
原型鏈繼承(對象間的繼承)
類式繼承(構(gòu)造函數(shù)間的繼承)
類式繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型的構(gòu)造函數(shù)。
嚴(yán)格的類式繼承并不是很常見,一般都是組合著用:
function Super(){
this.colors=["red","blue"];
}
function Sub(){
Super.call(this);
}
原型式繼承是借助已有的對象創(chuàng)建新的對象,將子類的原型指向父類,就相當(dāng)于加入了父類這條原型鏈
原型鏈繼承
為了讓子類繼承父類的屬性(也包括方法),首先需要定義一個構(gòu)造函數(shù)。然后,將父類的新實(shí)例賦值給構(gòu)造函數(shù)的原型。代碼如下:
function Parent(){
this.name = 'mike';
}
function Child(){
this.age = 12;
}
Child.prototype = new Parent();//Child繼承Parent,通過原型,形成鏈條
var test = new Child();
alert(test.age);
alert(test.name);//得到被繼承的屬性
//繼續(xù)原型鏈繼承
function Brother(){ //brother構(gòu)造
this.weight = 60;
}
Brother.prototype = new Child();//繼續(xù)原型鏈繼承
var brother = new Brother();
alert(brother.name);//繼承了Parent和Child,彈出mike
alert(brother.age);//彈出12
對象冒充
function Cat(n) {
this.name = n;
}
var obj = {};
// obj 替代里面的this, 稱為 對象冒充
Cat.call(obj, "貓貓");
// 貓貓
console.log(obj.name);
function Cat(a, b) {
console.log(a, b);
}
// call 的第1個參數(shù),其實(shí)就是函數(shù)內(nèi)部的this
// 第2個參數(shù),其實(shí)就是函數(shù)的第1個形參
// 第3個參數(shù),其實(shí)就是函數(shù)的第2個形參
// 第4個參數(shù),其實(shí)就是函數(shù)的第3個形參
// ... 依次順延
// Cat.call(null, "貓貓", "狗狗");
// apply 的第1個參數(shù),其實(shí)就是函數(shù)內(nèi)部的this
// 第2個參數(shù),必須是數(shù)組
// 數(shù)組的第1個元素 ,其實(shí)就是函數(shù)的第1個形參
// 數(shù)組的第2個元素 ,其實(shí)就是函數(shù)的第2個形參
Cat.apply(null, [1, 2]);