在两个ES6 Parent-Child类中,有没有办法在子构造函数执行后立即在父类中执行一些代码?

时间:2018-04-04 08:30:50

标签: javascript typescript ecmascript-6

示例:

class Parent { constructor() {} }  
class Child { constructor() { super(); someChildCode(); } }   

我只想在someChildCode()之后执行一些代码。是的,我可以把它放在那里,但要求不是那里放置那些代码。

因为有太多(n)个子类,只有一个父类,所以我想不重复代码(n)次。

P.S。我想要在创建子对象时像创建新的Child()一样简单的代码解决方案。

P.S。 Downvoter,关心解释?我意识到这个任务可能无法解决,这就是我提出这个问题的原因,以确定是否是这种情况。

3 个答案:

答案 0 :(得分:1)

如果您确实需要在构造时在每个子类中运行完全相同的代码,那么该公共代码可能属于父构造函数。但也许您需要一些特定于孩子的代码才能在公共代码之前运行,在这种情况下,您仍有问题。

无论哪种方式,一种可能的解决方案是根本不覆盖子类中的构造函数,而是让它们继承父构造函数,该构造函数包含任何公共代码以及可以覆盖的前后挂钩。必要的儿童班。例如:

class Parent {

    // do not override the constructor, conceptually "final"        
    constructor() {
        this.beforeCommonConstructorCode();

        // add any common constructor code here
        console.log("Common constructor code")

        this.afterCommonConstructorCode();
    }

    // override this in child classes as needed
    public beforeCommonConstructorCode() {
        // empty
    }

    // override this in child classes as needed
    public afterCommonConstructorCode() {
        // empty
    }
}

new Parent();
// in console:
// >> Common constructor code

当你继承Parent时,你只留下构造函数并将代码添加到适当的方法中:

class Child extends Parent {

    // remember, do not override constructor

    public beforeCommonConstructorCode() {
        console.log("Child pre-constructor code")
    }

    public afterCommonConstructorCode() {
        console.log("Child post-constructor code")
    }

}

new Child();
// in console:
// >> Child pre-constructor code
// >> Common constructor code
// >> Child post-constructor code

请注意,TypeScript不会阻止子类覆盖构造函数(there is no "final" keyword or functionality),因此需要遵守规则。否则,我认为这表现得像你喜欢的样子;您不必在每个子类中放置公共代码。

希望有所帮助。祝你好运。

答案 1 :(得分:0)

如果我理解正确的话,你可以有一个中间的父母来实现这个目标,因为你的代码是通用的,不依赖于孩子。

class Parent(){
}
class InterMediateParent extends Parent{
   constructor(){
      super();
      someCode();
   }

}

class Child extends InterMediateParent{
    constructor(){
     super();
    }

}

答案 2 :(得分:0)

您可以将该函数添加到 Parent原型,以便只在所有子对象中维护一个副本,并在子构造函数中调用该函数。



class Parent { 
  constructor() {
  
  } 
} 

Parent.prototype.someCommonCode = function() {
  console.log("Common code for all Parent as well as it's child objects");
}

class Child extends Parent {
  constructor() {
    //Child class code
    super();
    
    //Some child code
    this.someChildCode();
    
    //Call Parent's common function
    super.someCommonCode();
  }
  
  someChildCode() {
     console.log("Some child code");
  }
}

let child1 = new Child();
let child2 = new Child();