1. 程式人生 > 其它 >JS高階——call() 和 apply()

JS高階——call() 和 apply()

技術標籤: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