js call().apply().bind()的用法

时间:2021-04-08 21:38:34
function Person(age) {
this.age = age;
}
Person.prototype.sayHi = function (x, y) {
console.log((x + y) + ":====>" + this.age); //是实例对象
}; function Student(age) {
this.age = age;
}
var per = new Person(10); //实例对象
var stu = new Student(100); //实例对象
//sayHi方法是per实例对象的
per.sayHi.apply(stu, [10, 20]);//30:====>100
per.sayHi.call(stu, 10, 20);//30:====>100
apply和call的使用方法:
  1,apply的使用语法
      函数名字.apply(对象,[参数1,参数2,...]);
      方法名字.apply(对象,[参数1,参数2,...]);
  2,call的使用语法
      函数名字.call(对象,参数1,参数2,...);
      方法名字.call(对象,参数1,参数2,...);
 
  作用:改变this的指向,只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么就可以使用apply或者是call的方法改变this的指向
  不同的地方:参数传递的方式是不一样的
 
function Person(age) {
this.age=age;
}
Person.prototype.play=function () {
console.log(this+"====>"+this.age);
}; function Student(age) {
this.age=age;
}
var per=new Person(10);
var stu=new Student(20);
//复制了一份
var ff=per.play.bind(stu);
ff();
bind是用来复制一份
使用的语法:
  函数名字.bind(对象,参数1,参数2,...);---->返回值是复制之后的这个函数
  方法名字.bind(对象,参数1,参数2,...);---->返回值是复制之后的这个方法
bind 返回的是一个新的函数,你必须调用它才会被执行
 
总结:
   call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:
  call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面 obj.myFun.call(对象,参数1,参数2,...);
    apply的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(对象,[参数1,参数2,...]);
    bind除了返回是函数以外,它 的参数和call 一样。
 
  当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等!