JS高階——call() 和 apply()
阿新 • • 發佈:2021-02-04
技術標籤:javascript
一、方法定義:
每個函式都包含兩個非繼承而來的方法:call()方法和apply()方法。
兩個方法的作用是一樣的:都可以改變this的指向(在特定的作用域中呼叫函式)
一般this總是指向呼叫某個方法的物件,但在使用call()、apply()後會改變this的指向。
- call:呼叫一個物件的一個方法,用另一個物件替換當前物件。例如:B.call(A, args1,args2…); 即A物件呼叫B物件的方法。
- apply:呼叫一個物件的一個方法,用另一個物件替換當前物件。例如:B.apply(A, [args1,args2…]); 即A物件應用B物件的方法。
call() apply()的引數:
B.call(A, args1,args2…);
B.apply(A, [args1,args2…]);
- B:父類物件
- 引數 A:子類物件
- args1:傳給父類物件的引數
// 定義父類建構函式Person
function Person(name) {
this.name = name;
console.log(this.name);
}
// 繼承建構函式
function Student2(name) {
// 使用call()方法繼承父類建構函式,第二個引數用於傳參
Person.call(this, name);
// name為例項化student2物件時傳入的引數 “王五”,call再將引數傳遞給父類Person。
// 使用apply()方法繼承父類建構函式,第二個引數以陣列的形式表達,結果和call()相同
// Person.apply(this, [name]);
}
// 例項化子類student2物件s2
var s2 = new Student2("王五");
2、關於call()、apply()的改變this指向
// 給window新增屬性x
window.x = 100;
function fn() {
console.log(this);
console.log(this.x);
}
fn();
// 此時this指向window,this.x --> 100
var obj = {
x: 500
}
fn.call(obj);
// 此時this指向obj,this.x --> 500
fn.apply(obj);
// 此時this指向obj,this.x --> 500
3、call()、apply()常用用法
用於繼承
詳情見:
https://blog.csdn.net/ZPD_zpd/article/details/113590528