首先call只能被方法引用,一個方法.call(對象),簡單理解就做了兩件事,網上說的都太複雜了,如下圖
- 執行調用的方法
- 對象1裏面的this指向對象2
進一步理解這兩條需要藉助一個例子來
function Animal() {
this.name="animal";
this.age="15";
this.showName=function(){
console.log(this.name);
}
}
function Dog(){
this.name="dog";
this.age = '20';
}
var animal = new Animal();
var dog=new Dog();
animal.showName.call(dog) //打印dog
Animal.call(dog);
dog.showName() //打印animal
先看 animal.showName.call(dog)
- 第一步執行animal.showName()這個函數,
- 第二步是this指的是dog;
執行函數直接打印this.name, this指的是dog它有自己的name,就直接打印出"dog"字符串
再看Animal.call(dog);
執行 Animal()就是三個賦值語句,而裏面的this也指的是dog 這樣就給就成爲下面對象
- 第一步 執行Animal()這個函數
- 第二步this指的是dog
執行 Animal()就是對this的一些賦值,而this指的是dog對象,因此執行完dog就變成
{
name:"animal",
age:"15",
showName:function(){
console.log(this.name);
}
}
執行dog.showName()打印出來就是‘animal’
網上有很多關於call的例子,都是可以用這兩步來進行理解,注意的是,後面的對象可能指的是window;