首先call只能被方法引用,一个方法.call(内容),网上一搜都往继承上靠,对于初学者来说太复杂了,只要记住以下三点所有有关call的函数都可以看懂
- 只有函数才能调用call
- 执行调用call的函数 并把这个函数里的this指向call后面内容的所属对象
- 理解后面的所属对象分以下四点
不传,或者传null,undefined, 函数中的this指向window对象
传递另一个函数的函数名,函数中的this指向这个函数的引用
传递字符串、数值或布尔类型等基础类型,函数中的this指向其对应的包装对象,如 String、Number、Boolean
传递一个对象,函数中的this指向这个对象(大多都是用这个)
好像总结还是有点多,那就把没有的去掉只留最关键的两点
- 执行调用call的函数
- 把函数里的this用call后面的替换
进一步理解这两条需要借助一个例子来
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;