我试图理解handbook中的一行:
在ES 2015中,返回对象implicitly的构造函数将值
this
替换任何super(...)
的调用者.生成的构造器代码有必要捕获任何潜在的返回值super(...)
并将其替换为this
.
整句话对我来说都很模糊.有人能解释一下这里发生了什么吗?
我试图理解handbook中的一行:
在ES 2015中,返回对象implicitly的构造函数将值
this
替换任何super(...)
的调用者.生成的构造器代码有必要捕获任何潜在的返回值super(...)
并将其替换为this
.
整句话对我来说都很模糊.有人能解释一下这里发生了什么吗?
super
"函数调用"很奇怪.对于不返回对象的普通类,this
只是正在构造的类的当前实例. 对super()
的调用只是对同一this
进行操作,因此最终构建的对象是该类别的实例:
class Foo {
a = 10;
constructor() { }
}
class Bar extends Foo {
z: number;
constructor() {
super();
this.z = 1;
}
}
const b = new Bar();
console.log(b); // Bar: {a: 10, z: 1}
console.log(b instanceof Bar); // true
但如果超类从其构造函数返回一个值,那么子类中的this
就会以某种方式成为该值.这允许后续对this
的引用超类返回的同一对象.因此,除了所构造的对象实际上不是类的实例之外,该类别的行为"正常":
class Foo {
constructor() {
return { a: 10 };
}
}
class Bar extends Foo {
z: number;
constructor() {
super();
this.z = 1;
}
}
const b = new Bar();
console.log(b); // {a: 10, z: 1}
console.log(b instanceof Bar); // false
这意味着对super()
的调用必须看起来像"像函数一样调用超类构造函数,并查看它是否返回任何内容".如果是,则将该函数的结果assign变为this
. 好像你可以写
this = superCtor.call(this) || this;
但你不能这样做!您无法分配给this
. 但无论如何它都会发生,implicitly. 如果您查看当存在class
之前的JS版本的downleveling代码时调用超级构造器时会发生什么,您会看到类似的情况:
function Bar() {
var _this = _super.call(this) || this;
_this.z = 1;
return _this;
}
您会看到实际的this
已在各处被新的_this
变量替换.