繼承的定義 ECMAScript 實現繼承可以從父類入手,所有開發者定義的類都可作為父類,出於安全考慮,本地類和宿主類不能作為父類,因為容易收到惡意攻擊 創建只是用於給子類提供通用函數的父類被看作抽象類 子類可以繼承父類的所有屬性和方法,子類可以擴展父類中沒有的屬性和方法,還可以覆蓋父類中的屬性和方 ...
繼承的定義
- ECMAScript 實現繼承可以從父類入手,所有開發者定義的類都可作為父類,出於安全考慮,本地類和宿主類不能作為父類,因為容易收到惡意攻擊
- 創建只是用於給子類提供通用函數的父類被看作抽象類
- 子類可以繼承父類的所有屬性和方法,子類可以擴展父類中沒有的屬性和方法,還可以覆蓋父類中的屬性和方法
繼承的方式
一、對象冒充
原理:構造函數使用 this 關鍵字給所有屬性和方法賦值(即採用類聲明的構造函數方式)。因為構造函數只是一個函數,所以可使 ClassA 構造函數成為 ClassB 的方法,然後調用它。ClassB 就會收到 ClassA 的構造函數中定義的屬性和方法
實現:
function ClassA(name){
this.name = name;
this.sayName = function(){
console.log(this.name);
}
}
function ClassB(name){
this.newName = ClassA; //函數名是指向函數的指針
this.newName(name);
}
var objA = new ClassA();
var objB = new ClassB('wyang');
objB.sayName(); //wyang
對象冒充可以實現多重繼承
- 一個子類可以繼承多個父類
- 兩個類存在同名的屬性或方法時,後繼承的類優先順序高
二、call() 方法
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
參數:
- 第一個參數用作 this 的對象
- 參數都直接傳遞給函數自身
- 如果沒有提供
thisObj
參數,那麼Global
對象被用作thisObj
實現:
function fun(sex){
console.log(this.name + sex);
}
var obj = {
name:'wyang'
};
fun.call(obj,'is man'); //wyang
這個例子其實就是把
obj
替換成了fun函數中的this
,後面的參數與fun
函數的參數匹配
三、apply()方法
apply([thisObj[,argArray]])
參數:
- 第一個參數用作 this 的對象
- 傳遞給函數的參數的數組
- 如果沒有提供
thisObj
參數,那麼Global
對象被用作thisObj
實現:
function fun(sex,job){
console.log(this.name + sex + job);
}
var obj = {
name:'wyang'
};
fun.apply(obj,new Array('isman','fe')); //wyangismanfe
四、call()和apply()的區別
- 第一個參數一樣
- 第二個參數:
call()
方法就是普通參數;apply()
方法是把參數組合成了數組進行傳遞(和函數的arguments相似)
五、call()和apply()的總結
call()
、apply()
方法其實就是修改對象內部的this
的指向