this 的基础用法
this 的值:
- 非严格模式下,总是指向一个对象
- 在严格模式下,可以是任意值
- 全局上下文:无论是否在严格模式下,在全局执行环境中(在任何函数体外部)
this都指向全局对象。
// 在浏览器中, window 对象同时也是全局对象:
console.log(this === window); // true
a = 37;
console.log(window.a); // 37
this.b = "change";
console.log(window.b) // "change"
console.log(b) // "change"
- 函数上下文:this 的值取决于函数被调用的方式
function f1(){
return this;
}
//在浏览器中:
f1() === window; //在浏览器中,全局对象是window
//在Node中:
f1() === globalThis;
- 类上下文:类的本质也是函数,但也有些不同,在类的构造函数中,this 是一个常规对象。类中所有非静态的方法都会被添加到 this 的原型中:
class Example {
constructor() {
const proto = Object.getPrototypeOf(this);
console.log(Object.getOwnPropertyNames(proto));
}
first(){}
second(){}
static third(){}
}
new Example(); // ['constructor', 'first', 'second']
- 派生类:不像基类的构造函数,派生类的构造函数没有初始的
this绑定。在构造函数中调用super()会生成一个this绑定,并相当于执行如下代码,Base为基类:
this = new Base();
派生类不能在调用 super() 之前返回,除非其构造函数返回的是一个对象,或者根本没有构造函数。
class Base {}
class Good extends Base {}
class AlsoGood extends Base {
constructor() {
return {a: 5};
}
}
class Bad extends Base {
constructor() {}
}
new Good();
new AlsoGood();
new Bad(); // ReferenceError
uctor() {}
}
new Good();
new AlsoGood();
new Bad(); // ReferenceError
版权声明:本文为weixin_46229298原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
