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 中的演示时,我注意到变量 instanceB
和 instanceC
的构造函数略有不同:
- instanceB: ClassB
- __proto__: ClassA
- constructor: class extends
- instanceC: ClassC
- __proto__: ClassA
- constructor: class ClassC
我的问题是这些扩展声明是否完全相同,即使它们在检查器中的描述略有不同?
这是因为你把它赋给了一个变量。尝试
class classB extends classA
代替:
let classB = class extends...
它们在所有实际用途中都是相同的。考虑
module.exports = class extends ClassA {}
let ClassB = class extends ClassA {}
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
自从我开始使用 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 中的演示时,我注意到变量 instanceB
和 instanceC
的构造函数略有不同:
- instanceB: ClassB
- __proto__: ClassA
- constructor: class extends
- instanceC: ClassC
- __proto__: ClassA
- constructor: class ClassC
我的问题是这些扩展声明是否完全相同,即使它们在检查器中的描述略有不同?
这是因为你把它赋给了一个变量。尝试
class classB extends classA
代替:
let classB = class extends...
它们在所有实际用途中都是相同的。考虑
module.exports = class extends ClassA {}
let ClassB = class extends ClassA {}
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