在Mozilla的官網中對於call()的介紹是:
Call() 參數
thisArg
Javascript中的call()方法
先不專注於上面那些複雜的解釋,一步一步地開始這個過程。
Call()方法的實例
於是寫了另外一個Hello,World:
接著,我們再來看另外一個例子。
print.call(obj, "Hello", "World");
只是在這裡,我們傳進去的還是一個undefined,因為上一個例子中的undefined是因為需要傳進一個參數。這裡並沒有真正體現call的用法,看看一個更好的例子。
var h={p1:"hello", p2:"world", print:print};
h.print("fd");
var h2={p1:"hello", p2:"world"};
print.call(h2, "nothing");
call就用就是藉用別人的方法、物件來調用,就像調用自己的一樣。在h.print,當將函數作為方法呼叫時,this將指向相關的物件。只是這個例子我們沒有看明白,到底是h2調了print,還是print呼叫了h2。於是引用了Mozilla的例子
if (price
throw RangeError('Cannot create product "' name '" with a negative price');
return this;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
Food.prototype = new Product();
var cheese = new Food('feta', 5);
console.log(cheese);
var h2= function(no){
this.p1 = "hello";
this.p2 = "world";
print.call(this, "nothing");
};
h2();
這裡的h2作為一個接收者來呼叫函數print。如同在Food範例中,在一個子建構函式中,你可以透過呼叫父建構函式的 call 方法來實現繼承。
至於Call方法優點,在《Effective JavaScript》中有介紹。
1.使用call方法自訂接收者來呼叫函數。
2.使用call方法可以呼叫在給定的物件中不存在的方法。
3.使用call方法可以定義高階函數允許使用者給回呼函數指定接收者。