Evaluation order

我不理解关于判断顺序的内容.我有很多困惑的地方,我希望有人能帮我澄清一下.

  1. 如果存在扩展子句,则首先对其求值.它的求值结果必须为有效的构造函数或NULL,否则将引发TypeError.

class bar extends null {} // TypeError: Super constructor null of bar is not a constructor

为什么?根据上面的描述,这应该是正确的.

  1. 对于每个实例字段(公共或私有),保存其初始值设定项表达式.在实例创建过程中,在构造函数开始时(对于基类)或在Super()调用返回之前(对于派生类),计算初始值设定项.

class F {
  x = 1; // 2
  constructor() {
    this.y = 10; // 3
  }
}
class P extends F {
  j = 2; // 4
  constructor() {
    super(); // 1
    this.k = 20; // 5
  }
}
let p = new P();

为什么?我执行了这段代码,结果与它所描述的完全不同.

推荐答案

Why class bar extends null {} throws an error?

Extending null页中,你可以读到:

扩展NULL的设计目的是允许轻松创建不继承自对象原型的对象.然而,由于关于是否应该在构造函数中调用Super()的决定尚未确定,因此在实践中不可能使用任何不返回对象的构造函数实现来构造这样的类.

然后是真正起作用的代码:

class NullClass extends null {
  constructor() {
    // Using new.target allows derived classes to
    // have the correct prototype chain
    return Object.create(new.target.prototype);
  }
}

const proto = Object.getPrototypeOf;
console.log(proto(proto(new NullClass()))); // null

Javascript相关问答推荐

使用JavaScript重命名对象数组中的键

脚本.js:3:20未捕获的类型错误:无法读取空的属性(读取addEventHandler)

当promise 在拒绝处理程序被锁定之前被拒绝时,为什么我们会得到未捕获的错误?

TypScript界面中的Infer React子props

jQuery提交按钮重新加载页面,即使在WordPress中使用preventDefault()

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

如何使覆盖div与可水平滚动的父div相关?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

使用Java脚本根据按下的按钮更改S文本

在浏览器中触发插入事件时检索编码值的能力

使用js构造一个html<;ath&>元素并不能使其正确呈现

使用Nuxt Apollo在Piniastore 中获取产品细节

在css中放置所需 colored颜色 以填充图像的透明区域

Puppeteer上每页的useProxy返回的不是函数/构造函数

当从其他文件创建类实例时,为什么工作线程不工作?

为什么延迟在我的laravel项目中不起作用?

基于产品ID更新条带产品图像的JavaScript命中错误

Pevent触发material 用户界面数据网格中的自动保存

在ChartJS中使用spanGaps时,是否获取空值的坐标?

如何在移动设备中使用JAVASSCRIPT移除点击时的焦点/悬停状态