call 改变this指向
function Crazy(x,y) {
console.log(x,y)
console.log(this)
}
const obj = {
name:'我是obj'
}
Cazy(1,2) // 12 // window
Crazy.call(obj,1,2) // 12 // Object name: "我是obj"
- call 方法可以改变Crazy函数的this指向
子构造函数继承父构造函数的 属性
function Father(name,age){
this.name = name
this.age = age
}
function Son(name,age,a){
Father.call(this,name,age)
this.a = a
}
const son = new Son('balabala',99,0)
console.log(son) // Son {name: 'balabala', age: 99,a: 0}
子构造函数继承父构造函数的prototype
function Father(name,age){
this.name = name
this.age = age
}
Father.prototype.money = function () {
console.log(100000)
}
function Son(name,age,a){
Father.call(this,name,age)
this.a = a
}
// 让子元素的prototype指向父元素的实例 这样不会造成prototype的内存污染
Son.prototype = new Father()
// 将子元素的prototype的constructor指回子构造函数
Son.prototype.cunstructor = Son
Son.prototype.exam = function(){
console.log('我要去考试')
}
apply 改变this
// 巧妙使用apply
let Arr = [1,2,36,7,88]
let maxNum = Math.max.apply(Math,Arr)
console.log(maxNum) // 88
- 与call 的不同是 第二个参数需要是一个数组
bind 改变this指向
- 与前两个不同的是 他不会调用这个函数
- 返回的是一个改变this后的新函数
总结
相同点
都可以改变函数内部的this指向
区别点
- call和apply 会调用函数,并且改变函数内部的this指向
- call和apply传递的参数不一样,call传递参数num1,num2, apply 必须传递数组[num1,num2]
- bind不会调用函数,并且生成一个新函数,可以改变函数内部的指向
主要应用场景
- call 常做继承
- apply经常跟数组有关系 比如Math.max 的取最大值
- bind 不调用函数,并且还想改变this指向,比如改变定时器内部的this指向