我有一个名为Rule
的主类,它有一个param
属性和几个子类,例如:
class Rule {
param = {}
constructor (param) {
// here I want to add the logic to fuse this.param from child component (all are different) and param provided to the constructor
}
}
class SubRule1 extends Rule {
param = {
subparam: {
values: ['A', 'B', 'C'],
value: 'A'
}
}
constructor (param) {
super(param)
}
}
class SubRule2 extends Rule {
param = {
subparam: {
values: [1, 2],
value: 1
}
}
constructor (param) {
super(param)
}
}
let myrule = new SubRule1({ subparam: 'B' })
>> expected Object { subparam: { values: ['A', 'B', 'C'], value: 'B' }}
let myrule2 = new SubRule2({ subparam: 2 })
>> expected Object { subparam: { values: [1, 2], value: 2 }}
当示例化一个新对象时,我想将this.param
和param
参数融合到所有子类的constructor
中。我想在Rule
类中添加逻辑,但是,当访问Rule.constructor
类中的this.param
时,我不访问this.param
子属性,而是访问Rule
中定义的子属性。在所有子类中正确启动this.param
的正确设计是什么?
3条答案
按热度按时间efzxgjgh1#
从我上面的评论…
param
数据结构的最新更改确实打开了一个全新的主题,最好用...**“如何在不通过部分覆盖丢失数据的情况下深度合并两个结构相似的对象?”**与这个无声的主题转移相比,关于最佳class
/constructor
/super
设计的原始问题被边缘化了。new SubRule1({ subparam: { value: 'B' } })
而不是new SubRule1({ subparam: 'B' })
,new SubRule2({ subparam: { value: 2 } })
而不是new SubRule2({ subparam: 2 })
“***(1)**首先...关于OP的
Rule
构造函数的代码注解...// here I want to add the logic to fuse this.param from child component (all are different) and param provided to the constructor
*...父类或超类必须对子类/子类的属性和操作不敏感(因此它不做任何假设)。
**(2)**此外,对于每个Sub/Rules
param
成员的处理,没有继承,因此甚至不需要Rule
-SubRule
(父子)关系。这是由于在构造时如何处理每个示例的this.param
的初始化。即使与OP的示例代码一样(子)类型
SubRule1
和SubRule2
分别扩展了(super-)类型Rule
this.param
初始化完全被每个类型本身覆盖/隐藏。无论this.param
是什么值,在super调用结束时(链),最迟使用任何子类型构造函数,该值将完全重新分配/覆盖(如OP的params
默认值SubRule1
和SubRule2
所示)。因此,如果没有任何其他尚未显示的原型功能,任何与Rule
相关的继承都是完全不必要的。**(3)**此外,最近编辑的OP为
param
对象引入了一个比使用非嵌套对象容易实现的更复杂的合并行为,例如...而预期的合并...
和...
是...
...它要求自定义合并实现。
总结OP的主要任务是实现一个合适的自定义合并策略,而不是使用基于子类/类型的继承,因为后者很可能甚至没有有效的理由。
接下来提供的示例代码证明了上面所说的(尽管它保留了继承特性,以便与OP的主代码结构保持一致)。
编辑
如果OP希望通过
super
调用进行参数传递/转发的完全继承,则需要将方法从将每个类型的默认param
定义为自己的属性进行更改。这是由于
this
因此,每种类型的默认param
配置必须存储为例如每种类型的(或所有类型的)模块作用域。我不会将此类配置声明为静态类属性,因为它们会暴露出来,而模块作用域确保保护每个默认的param
配置。前面提供的实际上不需要任何继承的示例代码将更改为真实的的继承方法,其实现可能类似于下面提供的代码...
b5lpy0ml2#
你要找的模式是
要使其与继承一起工作,
defaults
必须是静态的:如果你想把它们合并得更深,这是另一个更复杂的故事。
wh6knrhe3#
要从父类构造函数访问param参数,不应该使用
this.param
,而应该使用console.log(param)
,它作为参数传递给父类的构造函数。this.param
只是指向该类的变量的指针。这样的东西可能对你有用。