Sam*_*Sam 7 javascript inheritance class
我的问题与理解类如何为属性赋值以及对象如何在 Javascript 中实例化有关。我想更多地了解这个过程是如何运作的。
如果我创建两个类,其中第二个类继承第一个类
class A {
name
constructor(name){
this.name = name
}
}
class B extends A {
name
status
constructor(name, status){
super(name)
this.status = status
}
}
Run Code Online (Sandbox Code Playgroud)
然后创建 B 类的实例,当我将其打印到控制台时
x = new B('myClass', true)
console.log(x)
Run Code Online (Sandbox Code Playgroud)
它打印名称变量未定义
B { name: undefined, status: true }
Run Code Online (Sandbox Code Playgroud)
我很确定 B 中的 name 属性会覆盖 A 中的 name 属性,但为什么 A 构造函数不将新的 name 变量分配为传递给它的值?
目前(2020 年 10 月)这是正确的行为。
当你设置
class A {
name
}
Run Code Online (Sandbox Code Playgroud)
这声明了一个类字段。这还不是一个标准,而是第四阶段的提案。它可能会改变,但不会太大。第三阶段是候选阶段,可能包括完成改进。
无论如何,根据提案的当前规范,您所看到的都是正确的。任何没有初始化程序的类字段都设置为undefined. 发生这种情况是因为您在没有初始化程序的情况下name调用了另一个类字段。B父构造函数中发生的赋值将被覆盖。
没有初始值设定项的字段设置为
undefined公共和私有字段声明都会在实例中创建一个字段,无论是否存在初始值设定项。如果没有初始化程序,则该字段设置为
undefined。这与某些转译器实现有点不同,后者完全忽略没有初始化程序的字段声明。例如,在下面的示例中,
new D将生成一个y属性为undefined而非 的对象1。Run Code Online (Sandbox Code Playgroud)class A { name }在不使用初始化器的情况下设置字段而不是删除字段的语义
undefined是,字段声明提供了可靠的基础,以确保所创建的对象上存在属性。这有助于程序员将对象保持在相同的一般状态,这可以使推理变得容易,并且有时在实现中更加优化。