<script>
function Student(name, age){
// 构造函数里面的this,用于给类定义成员(属性和方法)
this.name = name
this.age = age
this.show = function() {
// 方法里面的this指向方法的调用者
console.log(`${this.name},${this.age}岁`);
}
}
let s1 = new Student('张三', 20)
s1.show()
console.log('-'.repeat(50));
let obj1 = {
name: '张三',
age: 20,
sayHi: function() {
console.log(`${this.name},${this.age}岁`);
}
}
// 注意:obj1调用sayHi()方法,所以sayHi()方法里面的this执行obj1
obj1.sayHi() // 张三,20岁
// 使用var定义的成员(变量和方法)都会成为window对象的成员
var name = '陈浩南'
var age = 30
// let fun1 = obj1.sayHi
var fun1 = obj1.sayHi
// console.log(fun1);
console.log(window.fun1);
/* 控制台打印输出fun1的结果
ƒ (){
console.log(`${this.name},${this.age}岁`);
}
*/
// fun1() // 陈浩南,30岁
window.fun1() // 陈浩南,30岁
console.log('-'.repeat(50));
let obj2 = {
name: '李四',
age: 22,
sayHi: () => {
// 注意:箭头函数中没有this,如果在箭头函数中使用了this,会向外层寻找this的指向
// 如果所有的外层都没有this,最终会指向window对象。
console.log(`大家好!我叫${this.name},今年${this.age}岁`);
}
// 如果出现闭包,this的情况也与上面两种情况不一样
}
obj2.sayHi()
// window.obj2.sayHi()
console.log('-'.repeat(50));
let obj3 = {
name: '王五',
age: 24,
sayHello: function(){
console.log('Hello everyone!');
let sayHi = () => {
console.log(`大家好!我叫${this.name},今年${this.age}岁`);
}
return sayHi
}
}
// obj3.sayHello()
obj3.sayHello()()
// Hello everyone!
// 大家好!我叫王五,今年24岁
</script>