Oop 在使用»之前访问静态方法;超级«;
存在以下类层次结构:Oop 在使用»之前访问静态方法;超级«;,oop,ecmascript-6,Oop,Ecmascript 6,存在以下类层次结构: class A { constructor (obj) { this.obj = obj } } class B extends A { static createObj () { return {from: 'B'}; } constructor () { const obj = B.createObj(); super(obj); } } 我想延长这一期限,以便: class C extends B {
class A {
constructor (obj) {
this.obj = obj
}
}
class B extends A {
static createObj () {
return {from: 'B'};
}
constructor () {
const obj = B.createObj();
super(obj);
}
}
我想延长这一期限,以便:
class C extends B {
static createObj () {
return { from: 'C' };
}
}
//such that:
console.log(new C().obj.from) // 'C'
但是因此我需要将const obj=B.createObj()
更改为类似的内容:const obj=Object.getPrototypeOf(this.constructor.createObj()代码>,引发此错误的原因:
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
因此,基本上我想重写一个方法,该方法创建一个对象以在super()
调用中使用。因为在此之前不能使用此
,所以我选择使用静态方法。有没有办法引用静态方法,而不使用此方法,也不重写构造函数?如果出于某种原因,您真的希望您的this.obj=obj
仅在类A中执行,那么我会执行以下操作:
class A {
constructor(obj) {
this.obj = obj
}
}
class B extends A {
static createObj() {
return { from: 'B' };
}
constructor(obj) {
if (!obj) obj = B.createObj();
super(obj);
}
}
class C extends B {
static createObj() {
return { from: 'C' };
}
constructor(obj) {
if (!obj) obj = C.createObj();
super(obj);
}
}
console.log(new C().obj.from)
输出:
"C"
"C"
但在我看来,最好的OOP方法是:
class A {
constructor(obj) {
this.obj = obj
}
}
class B extends A {
static createObj() {
return { from: 'B' };
}
constructor(obj) {
super(obj);
this.obj = B.createObj();
}
}
class C extends B {
static createObj() {
return { from: 'C' };
}
constructor(obj) {
super(obj);
this.obj = C.createObj();
}
}
console.log(new C().obj.from)
输出:
"C"
"C"
第二种方法允许满足“在做任何其他事情之前调用super”的模式,这可以防止bug
这取决于您选择哪一个更适合您的需要,但两者都打印“C”,而不需要
Object.getPrototypeOf(this.constructor.createObj()
谢谢您的回答!但是我正在寻找一种方法,我只需要重写一种方法,修改obj
的创建。您建议的每一种方法都意味着重写太多的方法……如果您只想重写createObj,这意味着您不能重写构造函数。这意味着C的构造函数将是B的构造函数。这意味着从B的构造函数(父类)你想在子类中调用C.createObj(不是直接,使用getPrototypeOf(这个),我得到了这个,但不管怎样,这就是它要做的)。这确实是一种扭曲的、令人沮丧的OOP模式。为什么要首先只覆盖一个方法?是家庭作业还是什么?因为除了用于研究的技术概念验证之外,这样做没有任何意义。»这确实是一种扭曲和不受欢迎的OOP模式«-您能提供更多关于这方面的信息吗,链接或类似的信息?基本上,我在这里做的事情是使用decorator模式,obj
引用»组件«。我只是在寻找一种简单/快捷的方法来调整组件…