示例1
let obj = {
name:'张三',
age:20,
sayHi(){
return{
// 箭头函数中的this,指向外层方法中的this
sayHello:()=>{
console.log(this.name,this.age);
}
}
},
girl:{
// 注意:由于箭头函数中的this,执行外层方法中的this,当前箭头函数的外层已经没有方法了
// 所以,this指向window
// 所以,这个方法就不适合定义成箭头函数,改成普通函数,
// 调用该函数时采用call方法修改当前方法里面的this指向
sayHello:function(){
console.log('我的男朋友是'+this.name+','+this.age);
}
}
}
// 注意:obj.sayHi()返回的是对象,再去.sayHello()方法,
// sayHello()方法里面的this指向obj.sayHi()放回的是对象
obj,sayHi().sayHello()
obj.girl.sayHello.call(obj)
示例2
// var 定义的成员,会自动添加为window对象的成员
var address = '安德门'
var showAddress = function(){
console.log(`地点在${this.address}`);
}
let obj1 = {
name:'鹿晗',
age:30,
sayHi:function(){
console.log(`Hi!我叫${this.name},今年${this.age}岁`);
},
showMyFriend:function(){
return {
name:'关晓彤',
age:20,
sayHi(){
console.log(`Hi!我叫${this.name},今年${this.age}岁`);
},
showLh:()=>{
console.log(`Hi!我的男朋友是${this.name},今年${this.age}岁`);
}
}
}
}
obj1.sayHi()
let obj2 = obj1.showMyFriend()
obj2.sayHi()
obj2.showLh()
示例3
// 构造函数不能使用箭头函数定义
// 构造函数里面的this,用于给类定义成员(属性和方法)
function Person(name,age){
this.name = name
this.age = age
this.sayHI = function(){
console.log(`大家好!我是 ${this.name},今年${this.age}岁`);
}
}
let p1 = new Person('张三',20)
console.log(p1);
let obj1 = {
name:'肖战',
age:20,
sayHI:function(){
// 方法里面的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:20
}
// 可以将obj1的函数传给obj2,其实是obj2的sayHI方法,指向obj1的方法
obj2.sayHI = obj1.sayHI
obj2.sayHI()
// 将obj1身上的函数,传给了一个sayHI变量
let sayHI = obj1.sayHI
window.name = '小明'//设置window对象的name属性
window.age = 20//设置window对象的age属性
sayHI()
console.log('-----------------');
obj1.sayHello()
obj2.sayHello = obj1.sayHello
obj2.sayHello()
let sayHello = obj1.sayHello
sayHello()