ES6-最好在哪里初始化成员-父类或派生类?

时间:2019-03-16 00:12:01

标签: javascript oop ecmascript-6 constructor

我试图找出在ES6中是否有更好的初始化派生类的类成员的方法-在子级还是父级中,为什么?

例如:

选项1:

class AbstractAnimal {
   constructor() {
       this.voice = null;
   }

   makeVoice() {
      this.voice.make(); 
   }
}

class Dog extends AbstractAnimal {
   constructor() {
       super();
       this.voice = new Bark();
   }

   onSeeFriend() {
       this.makeVoice();
   }
}

选项2:

class AbstractAnimal {
   constructor(voice) {
       this.voice = voice;
   }

   makeVoice() {
      this.voice.make(); 
   }
}

class Dog extends AbstractAnimal {
   constructor() {
       super(new Bark());
   }

   onSeeFriend() {
       this.makeVoice();
   }
}

很显然,两种方法都有优点和缺点。 第一个选项分散了成员的初始化,这使得更难追踪。虽然第二个选项会将所有内容都冒到一个地方,但最终您可能会得到庞大的构造函数接受大量参数。

如果能听到您对此的想法,将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

这个问题是民意测验,我想指出的是,还有一种第三种方式,就像在JS:Mixins中一样

Pro s:允许将初始化抽象为 1/3 classAbstractAnimal确实是抽象的
缺点:对于诸如吠叫Dog之类的简单情况,可能很难辩解

class AbstractAnimal {
  makeVoice() { this.voice.make(); }
}
const Barking = Base => class extends Base {
  constructor() {
    super();
    this.voice = new Bark();
  }
}
class Dog extends Barking(AbstractAnimal) {
  onSeeFriend() { this.makeVoice(); }
}


class Bark { make() { console.log('Woof'); } }
new Dog().onSeeFriend();