如何使用与此示例使用工厂函数相同的方式使用es6类的合成?

时间:2017-10-17 15:05:09

标签: javascript oop composition es6-class

(请注意这不是一个重复的问题,请参阅下面的@Jeff M的答案)

我试图了解es6类的语法。我想用与使用工厂函数的代码相同的方式编写我的类:

示例1:

const barker = (state) => ({
  bark: () => console.log("Woof, I am " + state.name)
});

const driver = (state) => ({
  drive: () => state.position = state.position + state.speed
});

const murderRobotDog = (name) => {
  let state = {
    name,
    speed: 100,
    position: 0
  };
  return Object.assign({},
    barker(state),
    driver(state)
  );
};

const bruno = murderRobotDog("bruno");
bruno.bark(); // "Woof, I am Bruno"

我在一个完全不同的教程中使用'class'的类组合的工作示例如下所示:

示例2:

class Employee {
  constructor(firstName, familyName) {
  this._firstName = firstName;
  this._familyName = familyName;
  }

  getFullName() {
  return `${this._firstName} ${this._familyName}`;
  }
}

class Group {
  constructor(manager /* : Employee */ ) {
    this._manager = manager;
    this._managedEmployees = [];
  }

  addEmployee(employee) {
    this._managedEmployees.push(employee);
  }
}

我可以看到组合的概念是如何运作的,但这些看起来是非常不同的方式。使用工厂的第一个例子看起来最直观,但我想使用es6类语法(不用担心原因:)。

也许我错过了一些东西并且答案很明显,但是我如何以最简单的方式使用es6类完成实例1中的操作?感谢。

1 个答案:

答案 0 :(得分:1)

我可以看到你正在使用MPJ的“组合”示例,所以你需要知道的第一件事是MPJ got composition completely wrong。 MPJ 实际所展示的(没有他意识到)是多重继承。这就是为什么某人已将您的问题标记为另一个多重继承问题的可能副本。

JavaScript的原型链仅支持单继承,并且由于ES6类使用原型链,因此它们也仅支持单继承。但是使用a little trick,我们可以实现与多重继承相同的效果。

会是这样的:

const barker = Sup => class extends Sup {
  bark() { console.log("Woof, I am " + this.name) }
}

const driver = Sup => class extends Sup {
  drive() { this.position = this.position + this.speed }
};

class murderRobotDog extends driver(barker(Object)) {
  constructor(name) {
      super();
      this.name = name;
      this.speed = 100;
      this.position = 0;
  }
};

const bruno = new murderRobotDog("bruno");
bruno.bark(); // "Woof, I am Bruno"