javascript - Javascript 中类扩展声明之间的区别

标签 javascript inheritance extends

自从我开始使用 ES6 以来,我一直在使用扩展声明 class ClassB extends ClassA {} 来扩展类,并且最近这是我看到的唯一方式。

有一天,在阅读 Yeoman 文档时,我注意到他们正在扩展类 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

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

最佳答案

它们对于所有实际目的都是相同的。考虑到

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

然后

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

关于javascript - Javascript 中类扩展声明之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44169524/

相关文章:

java - Liferay 6.1 更改主题页面的标题

javascript - 将数组变成多维数组? JavaScript

C#泛型和继承

java - 从子类引用父类(super class)时,父类(super class)的字段值显示为零

java - 令人困惑的 Java 扩展

class - 如何在Dart中将父类转换为子类

java - 如何扩展XMLStreamReader?

javascript - 获取之前的 URL 并在 Javascript 中显示在页面上

javascript - 将多个图像下载到 1 个 zip 文件中

C++ Qt 基类虚析构函数