发布订阅
发布订阅者模式是什么?
老刘去买房,去到别墅区,他可以定很多套房子;去到平房区又可以定很多套房子(on)。交完首付后就可以安心了(emit)。如果不想买就不交钱退订(off)。售楼部有汤臣亿品,每人只能买一套房子(once)。
现在我们的任务就是帮老刘完成上面的步骤
拿上钱包
我们要帮老刘买房,那老刘拿什么买呢?当然是钱包了。 让我们帮老刘带上钱包:
js
class Eventmitter{
constructor() {
this.event = {}
}
}
先去订房
不同的房源可以买很多栋,那就好办了,老刘想买什么房就买什么房,想在哪个房源买就到哪个房源买。有钱就是任性。
js
on(type,cb){
if(!this.event[type]){
this.event[type] = [cb]
}else{
this.event[type].push(cb)
}
}
付上首付
既然定了房那肯定帮老刘把首付搞定啊,让我们帮老刘把首付付了。
js
emit(type,arg){
if(!this.event[type]){
return
}
this.event[type].forEach(cb=>{
cb(...arg)
})
}
退款
老刘真是的,才交完首付就想要退,没办法,谁叫老刘才是金主爸爸,那就退咯。
js
off(type,cb){
const index = this.event[type]
const handles =index && index.indexOf(cb)
if(handles !== -1){
index.splice(handles,1)
}
}
买限定
原来老刘看上了一栋限定的房子,还好金主是想花更多的钱,啊呸,是想要更好的生活。
js
once(type,cb){
if(this.event[type] && this.event[type].indexOf(cb) !== -1){
return
}
this.on(type,cb)
}
最后参观一下老刘买的房子怎么样吧。
js
const emiter = new Eventmitter()
function foo(){
console.log('去买房');
}
emiter.on('sell',foo)
emiter.emit('sell')
单例模式
单例模式什么意思?你只能有一个老婆,这是法律规定的。平时你这一个女朋友,哪一个女朋友就不说你了。可是老婆只能有一个。
那单例模式可以用来干什么呢?比如弹出框、验证登陆等等。
单例模式得创建一个静态函数方法,防止其他对象发现
js
class Person {
constructor(name) {
this.name = name
}
static getInfo(name) {
if (!Person.instance) {
Person.instance = new Person(name)
}
return Person.instance
}
}
let p1 = Person.getInfo('李总')
let p2 = Person.getInfo('李总')
console.log(p1 == p2);
再来一个闭包的实现:
js
function Storage() {
this.name = '张三'
}
const Helper = (function() {
let instance = null
return function() {
if (!instance) {
instance = new Storage()
}
return instance
}
})()
let p1 = new Helper() // {name: '张三'}
let p2 = new Helper()
console.log(p1 === p2);
使用立即执行函数是为了只创建一个instance。后面再调用也不会再创建instance,保证了唯一性。
这些是不是了解起来特别简单呢。