js 中的call,apply与bind
先看W3C官方定义:它可以用来调用所有者对象作为参数的方法,通过call能够使用属于另一个对象的方法
再看demo
比较person和person2,person2 未定义getAge 方法,正常情况下调用 person2.getAge 会报 ‘is not a function’
var person = {
age: 18,
name:"人物1",
getAge: function ( ...param) {
console.log( '参数',param)
return this.name + ",年龄=" + this.age
}
}
var person2 = {
age: 19,
name:"人物2"
}
console.log( person.getAge() )
console.log( person.getAge.call(person2,1,2,3) )
console.log( person.getAge.apply(person2,[1,2,3]) )
var func = person.getAge.bind( person2 ,1,1,2,3,4)
console.log( func() )
使用call,apply,bind后运行的结果
很明显, person2 未定义getAge,通过call,apply,bind使用person1的 getAge 方法,使 getAge方法 属于person2,这里也有另外一种说法:改变指针,即改变 getAge 里面的this指针,使this指向person2
bind有些不同,使用bind会返回一个新方法(如上func),运行新方法才会得到结果
call与bind分别接收参数,如 person.getAge.call(person2,1,2,3) 、 person.getAge.bind( person2 ,1,1,2,3,4) ,参数依次排列
apply 接收数组形式参数 ,如 person.getAge.apply(person2,[1,2,3])
call,apply,bind在观察者模式下最为常见
原创文章,作者:ourygey,如若转载,请注明出处:https://ourygey.com/2022/04/18/js-%e4%b8%ad%e7%9a%84call%ef%bc%8capply%e4%b8%8ebind/