class 之间的区别扩展了 Javascript 中的声明

Difference between class extends declarations in Javascript

自从我开始使用 ES6 以来,我一直在使用扩展声明 class ClassB extends ClassA {} 来扩展 classes,最近那是我见过的唯一方式。

有一天,在阅读 Yeoman 文档时,我注意到他们正在扩展 class module.exports = class extends ClassA {}.

我想这些声明一定只是用不同的方式来表达完全相同的事情。我测试了以下代码以证实我的怀疑,但它并不像我希望的那样清楚:

class ClassA {
    constructor(width) {
        this.width = width
    }
}

let ClassB = class extends ClassA {
    constructor(width, height) {
        super(width)
        this.height = height
    }
}

class ClassC extends ClassA {
    constructor(width, height) {
        super(width)
        this.height = height
    }
}

let instanceB = new ClassB(10, 10)
let instanceC = new ClassC(10, 10)

当我检查 chrome 中的演示时,我注意到变量 instanceBinstanceC 的构造函数略有不同:

- instanceB: ClassB
    - __proto__: ClassA
        - constructor: class extends
- instanceC: ClassC
    - __proto__: ClassA
        - constructor: class ClassC

我的问题是这些扩展声明是否完全相同,即使它们在检查器中的描述略有不同?

这是因为你把它赋给了一个变量。尝试 class classB extends classA 代替: let classB = class extends...

它们在所有实际用途中都是相同的。考虑

  1. module.exports = class extends ClassA {}
  2. let ClassB = class extends ClassA {}
  3. class ClassC extends ClassA

然后

  • (1) 不会有 .name property,而 ClassB.name == "ClassB"ClassC.name == "ClassC"
  • (3) 将在 .toString() method 返回的字符串中包含名称,而其他两个 returns "class extends ClassA {}" (这似乎是 Chrome devtools 检查是基于,我考虑只显示 class extends 一个错误并期望它会改变 - 对于未命名的 类)
  • 可能只是 class