在JavaScript中提升对象
所以我有一个类和另一个扩展第一个类的类。 我想知道是否有可能从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 =
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}
,会改变问题的性质,我不认为你可以传递对象并让它自动重命名它的属性以匹配构造函数。我不是说自动重命名。更像是自动升级对象:“”