作者回复: 谢谢。确实是正确答案之一。
作者回复: Oh... 这个问题在之前的课程中讲过,所以这里没有说很细。在第13讲中,
> 因此到了 ECMAScript 6 之后,那些一般函数,以及非派生类,就延续了这一约定:使用已经创建的this对象来替代返回的无效值。
> ... ...
> 对于那些派生的子类(即声明中使用了extends子句的类),ECMAScript 要求严格遵循“不得在构造器中返回非对象值(以及 null 值)”的设计约定,并在这种情况下直接抛出异常。
所以简单地说,就是如果class声明中不使用extends,那么它就跟你示例中的MyConstructor()一样,不会报错。而如果像你的MyClass那样使用了extends,就会报错了。
作者回复: 这个示例中,x与MyClassEx/MyClass这两个类是没有继承关系的,原型继承或类继承的逻辑在这里没有用。例如:
```
> x instanceof MyClass
false
> x instanceof MyClassEx
false
```
你需要自已来维护原型链/继承关系,例如:
```
class MyClass {
constructor() {
return Object.setPrototypeOf(new Date, new.target.prototype);
}
}
...
console.log('foo' in x); //true
console.log(x instanceof MyClassEx); // true
console.log(x instanceof MyClass); // false
```
因为继承关系跟类声明分开了,所以你可以有很多方法来灵活处理了。
作者回复: 是的。不需要。JavaScirpt确实允许“类”返回“任意对象”。从JavaScript 1.2的设计开始,就一直如此。