继承
报社有订阅发布的功能。
想让人也有订阅发布的功能,可以写一个更高层级的累,去让人和报社去继承。
这样人和报社都可以有订阅发布
class EventEmitter {on(){}off(){}emit(){}constructor(){}}class Person extends EventEmitter {constructor(){super()}sayHi(){}}class baoshe extends EventEmitter {constructor(){super()}print(){}}
重写
- 子类重写父类的所有属性,以实现多态
多态的意思是不同的子类对同一个消息有不同的反应
class Person extends EventEmitter {constructor(public name) {super()}on(eventName,fn){console.log('子类进行监听')super.on(eventName,fn)}}
继承有什么问题
如果这个类需要更多的功能怎么办
让EventEmitter 继承其他类
- 让Person继承两个类 (多继承,js不支持)
- 两个方法都不好
- 所以就可以使用组合
组合
组合并没有固定的写法。
让Person实现发布订阅
如何不使用继承,但是person又能使用on,off,emit三个api
class Person {eventEmitter = new EventEmitter()namesayHi(){}on(eventName,fn){this.eventEmitter.on(eventName, fn)}off(eventName,fn){this.eventEmitter.off(eventName, fn)}emit(eventName,data){this.eventEmitter.emit(eventName, data)}}
优化代码
class Person {sayHi(){}name}let person 1 = new Person('hasson')mixin(person1, new EventEmitter())function mixin(to,from){for(let key in from){to[key] = form[key]}}
组合例子
dog.wangwang().poop() // 拉屎cat.miaomiao().poop()抽象animal.poop()dog.wangwang()cat.miaomiao()
cleaningRobot.clean().run()murderRobot.kill().run()抽象robot.run()murderRobot.kill()cleaningRobot.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()
const createWang = (state)=>({wangwang:()=>{console.log(`汪汪,我是${state.name}`)}})const createRun = (state)=>({run:()=> state.position +=1})const createDog = (name) => {const state = {name,position:0}return Object.assign({state},createWang(state),createRun(state))}const dog = createDog('小白')
狗型杀人机器人:
const createMurderDogRobot = (name) => {const state = {name,position:0}return Object.assign({},createWang(state),createRun(state),createKill(),)}const murderDogRobot = createMurderDogRobot('小黑')
组合能实现扁平化的重新分配
继承是垂直方向的,一旦出现两个垂直方向的交叉,是做不到的
