【问题标题】:How do I use composition with es6 classes in the same way as this example does using factory functions?如何以与本示例使用工厂函数相同的方式将组合与 es6 类一起使用?
【发布时间】:2018-03-29 08:03:35
【问题描述】:

(请注意这不是一个重复的问题,请参阅下面@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"

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

示例 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 中所做的事情?谢谢。

【问题讨论】:

标签: javascript oop composition es6-class


【解决方案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"

【讨论】:

  • 天哪,谢谢!!我已经为此困惑了好几个星期,我简直不敢相信我的英雄 MPJ 错了,我的世界被炸毁了!我阅读了论坛的链接,但所有示例都不再是 JS。你能再帮我一次,告诉我如何在 es6 类中使用 PROPER 组合来做 MPJ 示例吗?
  • Composition 正在使用引用其他对象的实例变量。像这样pastebin.com/Edqg9ZvX
  • @JeffM MPJ 没有弄错构图。他只是使用对象连接(或您所说的多重继承)来创建复合对象,作为进行复合的方法之一。 Eric Elliot 在他的文章 (medium.com/javascript-scene/…) 中对此进行了很好的描述。
  • @TimurMamedov 如果是多重继承,那么它是 NOT 组合。埃里克·埃利奥特(Eric Elliott)是这种错误信息的原始来源。 MPJ 从他那里学到了这一点,然后又重复了同样的错误信息。
  • @JeffM 感谢您的洞察力,不知道。
猜你喜欢
  • 2013-03-30
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多