Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在使用»之前访问静态方法;超级«;_Oop_Ecmascript 6 - Fatal编程技术网

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
引用»组件«。我只是在寻找一种简单/快捷的方法来调整组件…