总结apply,call和bind方法各自的特点
1.apply:
使用语法:1)函数名.apply(对象,[参数1,参数2,参数3......]);
2)方法名.apply(对象,[参数1,参数2,参数3......]);
作用:改变this指向;
特点:传参需以数组的形式传入;
2.call:
使用语法:1)函数名.call(对象,参数1,参数2,参数3.....);
2)方法名.call(对象,参数1,参数2,参数3.....);
作用:改变this指向;
特点:传参需按照参数列表传入即可;
3.bind方法
使用语法:函数名.bind(对象,参数1,参数2,参数3.....);用法同call一样
作用:函数名.bind()方法,相当于是复制了这个函数,返回值就是复制后的一个函数
4.call和apply以及bind的异同点:
相同点:作用相同,都是改变this指向
异同点:1.传参列表不同,call和bind的传参列表相同,apply的传参列表略有差异
2.方式不同:call和apply相当于调用,而bind是复制了一份
注意:无论是apply还是call或者是bind中第一个参数不传,或者是传的是null,那么函数中的this都是window
例1:
//创建一个构造函数Person
function Person(name,sex,age){
this.name = name;
}
Person.prototype.sum = function(x,y){
console.log((x+y)+"====>"+this.id);
}
function Student(name,id){
//这里将Person构造函数的this指向改为Student
//用法1:使用apply来改变this指向:传参列表是数组形式
Person.apply(Student,[name]);
//用法2:使用call来改变this指向:传参以参数列表传入
Person.call(Student,name);
this.id = id;
}
//这是Person构造函数的实例化对象
var per = new Person("小简");
//这是Student构造函数的实例化对象
var stu = new Student("小明","01");
//改变方法的this指向
//用法1:apply使用
per.hello.apply(Stu,[10,20]);
//用法2:call使用
per.hello.call(Stu,10,20);