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 等等!