继承

报社有订阅发布的功能。
想让人也有订阅发布的功能,可以写一个更高层级的累,去让人和报社去继承。
这样人和报社都可以有订阅发布

  1. class EventEmitter {
  2. on(){}
  3. off(){}
  4. emit(){}
  5. constructor(){}
  6. }
  7. class Person extends EventEmitter {
  8. constructor(){
  9. super()
  10. }
  11. sayHi(){}
  12. }
  13. class baoshe extends EventEmitter {
  14. constructor(){
  15. super()
  16. }
  17. print(){}
  18. }

重写
  • 子类重写父类的所有属性,以实现多态
  • 多态的意思是不同的子类对同一个消息有不同的反应

    1. class Person extends EventEmitter {
    2. constructor(public name) {
    3. super()
    4. }
    5. on(eventName,fn){
    6. console.log('子类进行监听')
    7. super.on(eventName,fn)
    8. }
    9. }

    继承有什么问题

    如果这个类需要更多的功能怎么办

  • 让EventEmitter 继承其他类

  • 让Person继承两个类 (多继承,js不支持)
    • 两个方法都不好
    • 所以就可以使用组合

组合

组合并没有固定的写法。

让Person实现发布订阅
如何不使用继承,但是person又能使用on,off,emit三个api

  1. class Person {
  2. eventEmitter = new EventEmitter()
  3. name
  4. sayHi(){}
  5. on(eventName,fn){
  6. this.eventEmitter.on(eventName, fn)
  7. }
  8. off(eventName,fn){
  9. this.eventEmitter.off(eventName, fn)
  10. }
  11. emit(eventName,data){
  12. this.eventEmitter.emit(eventName, data)
  13. }
  14. }

优化代码

  1. class Person {
  2. sayHi(){}
  3. name
  4. }
  5. let person 1 = new Person('hasson')
  6. mixin(person1, new EventEmitter())
  7. function mixin(to,from){
  8. for(let key in from){
  9. to[key] = form[key]
  10. }
  11. }

组合例子

  1. dog
  2. .wangwang()
  3. .poop() // 拉屎
  4. cat
  5. .miaomiao()
  6. .poop()
  7. 抽象
  8. animal
  9. .poop()
  10. dog
  11. .wangwang()
  12. cat
  13. .miaomiao()
  1. cleaningRobot
  2. .clean()
  3. .run()
  4. murderRobot
  5. .kill()
  6. .run()
  7. 抽象
  8. robot
  9. .run()
  10. murderRobot
  11. .kill()
  12. cleaningRobot
  13. .clean()

现在有两个类,动物和机器人
那我现在需要一个狗型杀人机器人,咋整
需要
robot run

  • murderRobot kill

animal poop(不需要)

  • dog wangwang

如果是继承的话,很难只拿wangwang,不继承poop

通过组合:

  • dog = poop() + wangwang()
  • cat = poop() + miaomiao()
  • cleaningRobot = run() + clean()
  • murderRobot = run() + kill()
  • 狗型杀人机器人 = run() + kill() + wangwang()
  1. const createWang = (state)=>({
  2. wangwang:()=>{
  3. console.log(`汪汪,我是${state.name}`)
  4. }
  5. })
  6. const createRun = (state)=>({
  7. run:()=> state.position +=1
  8. })
  9. const createDog = (name) => {
  10. const state = {name,position:0}
  11. return Object.assign(
  12. {state},
  13. createWang(state),
  14. createRun(state)
  15. )
  16. }
  17. const dog = createDog('小白')

狗型杀人机器人:

  1. const createMurderDogRobot = (name) => {
  2. const state = {name,position:0}
  3. return Object.assign(
  4. {},
  5. createWang(state),
  6. createRun(state),
  7. createKill(),
  8. )
  9. }
  10. const murderDogRobot = createMurderDogRobot('小黑')

组合能实现扁平化的重新分配
继承是垂直方向的,一旦出现两个垂直方向的交叉,是做不到的