如何在ES6中调用我的类'父级的父级构造函数?

时间:2017-03-17 15:48:48

标签: javascript ecmascript-6

我正在使用ES6类,我的类(A)扩展了B类,B类扩展了C类。如何扩展方法,然后调用该方法的C版本。

class C {
  constructor() {
    console.log('class c');
  }
}

class B extends C {
  constructor() {
    super()
    console.log('no, I don't want this constructor.');
  }
}

class A extends B {
  constructor() {
    // What should I be doing here?  I want to call C's constructor.
    super.super();
  }
}

编辑:谢谢大家,我会停止尝试做这个愚蠢的事情。在我的情况下,代码重用的微小收益不值得杂技。

5 个答案:

答案 0 :(得分:5)

You can’t not call the parent’s constructor in an ES6 class.根据你的评论判断,也许你应该尝试这样的事情?

class Mixin {
  static include(constructor) {
    const descriptors = Object.getOwnPropertyDescriptors(Mixin.prototype);

    Object.keys(descriptors).forEach(name => {
      Object.defineProperty(constructor.prototype, name, descriptors[name]);
    });
  }

  someCommonFunction() {
    // Perform operation common to B and C
  }
}

delete Mixin.prototype.constructor;

class B extends A {
}

Mixin.include(B);

class C extends A {
}

Mixin.include(C);

答案 1 :(得分:1)

简单但丑陋的方法是在A的构造函数中检查实例B

class B extends C {
  constructor() {
    super()
    if (!(this instanceof A)) {
      console.log('no, no no, I don\'t want this!');  
    }
  }
}



class A {
  constructor() {
    console.log('class c');
  }
}

class B extends A {
  constructor() {
    super()
    if (!(this instanceof C)) {
      console.log('no, no no, I don\'t want this!');  
    }
  }
}

class C extends B {
  constructor() {
    super();
  }
}

const c = new C()




答案 2 :(得分:0)

我能想到的最佳方式,可能不一定是最好的方式,是在B中定义一个调用A super()的函数,这样你就可以在C中继承它扩展,你会准备好它。

答案 3 :(得分:0)

class C {
  constructor(){
    console.log('C');
  }
}

class AB extends C {
  constructor(){
    super();
  }
}

class B extexts AB {
  constructor(){
    super();
    console.log('B');
  }
}

class A extends AB {
  constructor(){
    super();
  }
}

我认为在两者之间构建一个类并从中扩展A和B是唯一的方法,因为evere构造函数必须首先调用他自己的超级构造函数。

new B(); // output is CB
new A(); // output is C

答案 4 :(得分:0)

你需要一些杂技,我认为我不会建议这种形式是“干净/透明的代码”观点,但是可以按照以下方式进行:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<script type="text/javascript">

class C {
  constructor() {
      this.fooExtension = null;
  }

  initC(aFoo) {
    this.fooExtension = aFoo;
  }

  foo() {
    if (this.fooExtension === null) {
        console.log('fooFromC');
    } else {
        console.log('extend foo called from C');
        this.fooExtension();
    }
  }
}

class B extends C {
  constructor() {
    super();
  }

  foo() {
    super.foo();
  }
}

class A extends B {
  constructor() {
    super();

    let fooExtension = function() {
      console.log('fooFromA');
    };

    this.initC(fooExtension);
  }
}

c = new C();
c.foo();

a = new A();
a.foo();

</script>
</head>
<body>
</body>
</html>

这将产生以下输出:

  

fooFromC
  扩展foo来自C
  fooFromA