Function.prototype.call
本文主要是個人對call()方法的一點理解
函式原型
myFunc.call(thisArg, arg1, arg2, ...)
引數理解
call
方法與傳統的傳參呼叫不同的是,call
不只指定函式的引數(arg1,arg2...),還指定了函式在執行時的this
指向(thisArg)
這是一個能幫助理解this指向的例子 :
"use strict";
function Product(name, price) {
this.name = name;
this.price = price;**函式說明**
>**可以讓call()中的物件(thisArg)呼叫當前物件所擁有的function(myFunc)**
}
function Food(name, price) {
Product.call(this, name, price);
console.log(this.name)
}
Food('cheese', 5)
輸出:
在函式
Food
中,我們並沒有為其this
賦值,卻能夠輸出this
的值,這是因為,我們使用了call()
,將Food
中的this
傳給了Product
函式,並且為其進行了賦值
我們可以將上面程式碼理解成下面這樣,雖然不能執行,但能幫助我們理解上面程式碼的傳參過程:
"use strict";
function Product(foodThis,name, price) {
foodThis.name = name;
foodThis.price = price;
}
function Food(name, price) {
Product(this, name, price);
console.log(this.name)
}
Food('cheese', 5)
作用理解
可以讓call()中的物件(thisArg)呼叫當前物件所擁有的function(myFunc)
假如物件A有方法func(arg1,arg2)
,而物件B沒有,此時我們便可以藉助call
函式來完成B物件呼叫A物件方法的過程,而不用為B物件再寫一個func()
A.func.call(B,arg1,arg2)
此時call函式的作用可以這樣描述 :
- 通過call函式,讓call中的物件B呼叫了當前物件A所擁有的方法func()
關於call的另一些例子可以在個人的這篇文章找到
類陣列元素如何作為陣列使用 ---(call方法)