call 是爲了改變某個函數運行時的上下文(context)而存在的,換句話說,就是爲了改變函數體內部 this 的指向。
JavaScript 的一大特點是,函數存在「定義時上下文」和「運行時上下文」以及「上下文是可以改變的」這樣的概念。
function fruits() {} fruits.prototype = { color: "red", say: function() { console.log("My color is " + this.color); } } var apple = new fruits; apple.say(); //My color is red
但是如果我們有一個對象banana= {color : "yellow"} ,我們不想對它重新定義 say 方法,那麼我們可以通過 call 或 apply 用 apple 的 say 方法:
banana = { color: "yellow" } apple.say.call(banana); //My color is yellow apple.say.apply(banana); //My color is yellow
什麼的say方法裏面的“this”就指向banana對象了,因此打印出的color是yellow;
所以,可以看出 call 是爲了動態改變 this 而出現的,當一個 object 沒有某個方法(本栗子中banana沒有say方法),但是其他的有(本栗子中apple有say方法),我們可以藉助call或apply用其它對象的方法來操作。
補充:
function fruits() {} fruits.prototype = { color: "red", say: function() { console.log("My color is " + this.color); } } var apple = new fruits; banana={ color:"yellow" } //banana是指向對象 //帶參數的原型對象——成員方法 apple.say.call(banana,"我是參數");
轉載:https://www.cnblogs.com/luzhanshi/p/11982477.html