在JavaScript中提升对象

在JavaScript中提升对象,javascript,class,object,Javascript,Class,Object,所以我有一个类和另一个扩展第一个类的类。 我想知道是否有可能从JavaScript中的第一个类升级扩展类 class Class1 { constructor(data) { this.var1 = data.var1 this.var2 = data.var2 } } class Class2 extends Class1 { constructor(o) { this = o this.var3 = '!!!' } } const o =

所以我有一个类和另一个扩展第一个类的类。 我想知道是否有可能从JavaScript中的第一个类升级扩展类

class Class1 {
  constructor(data) {
    this.var1 = data.var1
    this.var2 = data.var2
  }
}

class Class2 extends Class1 {
  constructor(o) {
    this = o
    this.var3 = '!!!'
  }
}

const o = new Class1({var1: 'HELLO', var2: 'WORLD'})
const o2 = new Class2(o)

console.log(o2.var1)
console.log(o2.var2)

我知道
this=o
将抛出一个错误。但是有没有一种方法可以在不必将旧对象的每个字段分配给新对象的情况下完成任务?

您可以使用
super()
函数:

Class1类{
建造师(数据){
this.var1=data.var1
this.var2=data.var2
}
}
类2扩展了类1{
建造师(o){
超级(o)
this.var3=“!!!”
}
}
const o=new Class1({var1:'HELLO',var2:'WORLD'})
常数o2=新类别2(o)
console.log(o2.var1)/->您好

console.log(o2.var2)/->WORLD
您可以使用
super()
函数:

Class1类{
建造师(数据){
this.var1=data.var1
this.var2=data.var2
}
}
类2扩展了类1{
建造师(o){
超级(o)
this.var3=“!!!”
}
}
const o=new Class1({var1:'HELLO',var2:'WORLD'})
常数o2=新类别2(o)
console.log(o2.var1)/->您好
console.log(o2.var2)/->WORLD
您可以在class2上的构造函数开头调用
super(o)

您可以在类2的构造函数开头调用
super(o)


应该提到的是,这确实会再次运行
Class1
构造函数,在某些情况下可能会产生不希望的副作用。如果这是一个问题,则取决于OP。作为导致错误的这种方法的一个示例:
Class1
可能会使用带有字段
var1、var2、var3
data对象,并设置
this.var3=data.var3+data.var1
。如果是这种情况,
var3
对于
o
o2
将有一个不同的值,因为
Class1
构造函数将覆盖
var3
的值。出于这个原因,您将被迫以这样的方式设计
Class1
,即它特别考虑其构造函数中的
Class1
对象,尽管这会再次运行
Class1
构造函数,在某些情况下可能会产生不希望的副作用。如果这是一个问题,则取决于OP。作为导致错误的这种方法的一个示例:
Class1
可能会使用带有字段
var1、var2、var3
data对象,并设置
this.var3=data.var3+data.var1
。如果是这种情况,
var3
对于
o
o2
将有一个不同的值,因为
Class1
构造函数将覆盖
var3
的值。出于这个原因,您将被迫设计
Class1
,以便它特别考虑其构造函数中的
Class1
对象。如果
o
对象位于
o2
的原型链中,那么从
o2
可以观察到对
o
的更改,或者你真的想要复制这些属性吗?如果复制,如果这些属性的值是对象,它们是否应该是深度副本?对象是否应该位于
o2
的原型链中,以便从
o2
观察到对
o
的更改,或者您真的希望复制属性?如果被复制,如果这些属性的值是对象,那么它们应该是深度副本吗?是的,但是如果
Class1{constructor(data){this.var10=data.var1 this.var11=data.var2}}
改变了问题的性质,我不认为你可以传递对象并让它自动重命名它的属性以匹配构造函数。我不是说自动重命名。更像是对象的自动升级:''是的,但是如果
类Class1{constructor(data){this.var10=data.var1 this.var11=data.var2}
,会改变问题的性质,我不认为你可以传递对象并让它自动重命名它的属性以匹配构造函数。我不是说自动重命名。更像是自动升级对象:“”