对象进阶
1.this
构造函数里面的this,用于给类定义成员(属性和方法)
方法里面的this,指向方法的调用者
箭头函数中没有this,如果在箭头函数中使用了this,会向外层寻找this的指向
如果所有的外层都没有this,最终会指向window对象
// 注意:构造函数不能使用箭头函数定义
function Person(name,age){
// 在构造函数中,this关键字,用于给类添加成员
this.name = name
this.age = age
this.sayHi = function(){
console.log(`大家好!我叫${this.name},今年${this.age}岁`);
}
}
// 创建对象,该对象会拥有,类型中定义的所有成员。
let p1 = new Person('张三',20)
console.log(p1);
p1.sayHi()
let p2 = new Person('李四',24)
console.log(p2);
p2.sayHi()
console.log('-----------------------------------------');
let obj1 = {
//对象的两个属性
name:'肖战',
age:20,
//对象的方法
sayHi:function(){
// 在方法中,this指向方法的调用者,谁在调用该方法,this就指向谁
// 如果一个方法,不是由对象调用执行的,而是直接执行的,那么该方法里面的this就执行window对象
console.log(`Hi!我是${this.name},今年${this.age}岁`);
},
sayHello:()=>{
// 在箭头函数中没有this,如果在箭头函数中使用了this,它会向上一层函数中去找this
// 如果上一层函数也是箭头函数,或者没有上一层函数了,这个时候this就指向window对象。
console.log(`Hello!我是${this.name},今年${this.age}岁`);
}
}
obj1.sayHi()
let obj2 = {
name:'关晓彤',
age:22,
}
//可以将obj1的函数传给obj2,其实是obj2的sayHi方法,指向obj1的方法
obj2.sayHi = obj1.sayHi
obj2.sayHi()
//将obj1身上的函数,传给了一个sayHi变量
let sayHi = obj1.sayHi
window.name = '小明' //设置window对象的name属性
window.age = 22 //设置window对象的age属性
sayHi()
// var 定义的成员,会自动添加为window对象的成员
2.call apply bind
call apply bind 更改方法里面this的指向
1.使用call()改变方法里面,this的指向
call()方法的第一个参数必须是指定的对象,方法的原有参数,挨个放在后面
2.使用apply(),也可以改变方法里面this的指向,第一个参是指定的对象,方法的原有参数,统一放到第二个数组参数中。
3.使用bind(),也可以改变方法里面this的指向,用法给call()一样
call()是直接运行方法,bind()是返回新的方法,然后再重新调用。