在js中的子类中调用函数时,super和this之间的区别



class A {
data1 = 1;
constructor(){
this.data2 = 2;
}
test() { console.log(this) }
}
class B extends A {
constructor() {
super();
}
funcA() { this.test() }
funcB() { super.test() }
}
let foo = new B()
foo.funcA();
foo.funcB();

呼叫时funcA()funcB()有什么区别,或者它们完全相同?顺便说一句,在构造函数内外声明的data1data2之间有什么区别,这是首选的

使用this.test(),可以引用实例。实例上不直接存在test属性,因此对于标准原型继承,将检查原型对象的属性。这个原型是A.prototype,它确实有一个test属性,所以它被调用了。

使用super.test(),您可以开始在超类A.prototype上查找test属性,该属性会立即找到并调用。

如果你在B上也有一个test方法,你就会看到区别。

class A {
data1 = 1;
constructor(){
this.data2 = 2;
}
test() { console.log('a') }
}
class B extends A {
constructor() {
super();
}
test() {
console.log('b');
}
funcA() { this.test() }
funcB() { super.test() }
}
const foo = new B()
foo.funcA();
foo.funcB();

BTW,在构造函数内外声明的data1和data2之间有什么区别,这是首选的

这取决于你。不过,类字段(在构造函数之外赋值(稍微简洁一点(尤其是当构造函数不包含任何其他内容时(,但不太受支持——如果你想使用它们,请确保可以转换代码。

相关内容

最新更新