首先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;