call,apply,bind的区别以及应用
一、call和apply,bind可以修改this的指向
let obj1 = {
name: "彭于晏",
sayHello: function () {
console.log('Hello '+this.name);
}
}
let obj2 = {
name:'胡歌'
}
obj1.sayHello()
obj1.sayHello.call(obj2)
obj1.sayHello.apply(obj2)
二、call,apply,bind的区别
1.参数的区别
- call,apply,bind传参
- call(this,参数1,参数2,参数3…)
- apply(this,[参数1,参数2,参数3…])
- bind(this,参数1,参数2,参数3…)
很明显,bind和call传参数是一样的按照顺序依次传参,apply的传参则是以数组形式按照顺序依次传参
2.用法的区别
- call和apply使用会改变函数的this指向并执行函数
- bind也可以改变this指向但是返回的是一个方法,需要使用()调用
let obj1 = {
name: "彭于晏",
sayHello: function (Russian,Pakistan) {
console.log('Hello '+this.name,Russian+' '+this.name,Pakistan+' '+this.name);
}
}
let obj2 = {
name:'胡歌'
}
obj1.sayHello()
obj1.sayHello.call(obj2,'乌拉','萨拉姆')
obj1.sayHello.apply(obj2,['乌拉','萨拉姆'])
let bind1 = obj1.sayHello.bind(obj2, '乌拉', '萨拉姆')
bind1()
三、call、apply、bind1的实际应用
子类可以继承父类的方法
function Animal() {
this.eat = function () {
console.log('吃东西');
}
}
function Cat() {
Animal.call(this)
}
let cat = new Cat()
cat.eat()
实现多重继承
function Animal() {
this.eat = function () {
console.log('吃东西');
}
}
function Fly() {
this.fly = function () {
console.log('飞翔');
}
}
function Cat() {
Animal.call(this)
Fly.call(this)
}
let cat = new Cat()
cat.eat()
cat.fly()