1、单例模式:Document/*就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问来访问该对象。*/单例模式核心代码functionPerson()this.name=Jack/全局varinstance=nullfunctionsingleton()if(instance=null)instance=newPerson()returninstance/*singleton第一次调用的时候+if条件判断,判断instan
2、ce=null+现在自己作用域里面没有instance,去到父级作用域访问+也就是拿到了全局作用域的instance+现在全局的instance就是一个null,if条件为true+给instance赋值给一个Person的实例(实例001)+现在全局的instance的值就是实例001+returninstance就是return实例001+p1得到的就是实例001*/varp1=singleton()/*singleton第二次调用的时候+if条件判断,判断instance=null+现在自己作用域里面没有instance,去到父级作用域访问+也就是拿到了全局的instance+现在全局的
3、instance就是一个实例001+if条件不满足,代码不执行+returninstance就是return实例001+p2得到的依旧是实例001*/varp2=singleton()/p1和p2得到的都是第一次执行的时候的实例/他们两个其实是一个地址console.log(p1=p2)/true观察者模式:Document/*观察者模式的使用场合就是:当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式。*/需要两个构造函数(被观察者和观察者)/1.被观察者(学生,小明)classStudentconstructor()/construct
4、or就相当于es5的构造函数体是一个构造器/一个学生本身的状态,应该是好好学习this.state=好好学习/准备一个数组,放监视学生的人/将来一旦状态从好好学习变成玩手机的时候,就让这个里面的所有老师触发技能this.observers=/方法/1.可以改变状态的方法setState(value)/可以把自己的状态改变this.state=value/状态一旦改变,就要通知监视他的人this.notify()/2.获取自己的状态getState()returnthis.state/3.添加观察着/向this.observers里面追加一个看着这个同学的人attach(observer)thi
5、s.observers.push(observer)/4.通知this.observers数组里面的每一个人,状态改变了notify()this.observers.forEach(item=item.qingjiazhang(this.state)/2.观察着(老师,班主任,教学主任,年级主任,.)classObserverconstructor(name)/用它来标明一下老师的类别this.name=name/方法,就是这些老师能触发的技能qingjiazhang(state)console.log(我是$this.name,因为你$state了,我要请你家长来!)varxiaoming=
6、newStudent()/被观察者varbanzhuren=newObserver(班主任)/观察者varjiaowuzhuren=newObserver(教务主任)/观察者varnianjizhuren=newObserver(年级主任)/观察者/让班主任看着小明xiaoming.attach(banzhuren)/让教务主任看着小明xiaoming.attach(jiaowuzhuren)/让年级主任看着小明xiaoming.attach(nianjizhuren)/当小明状态改变的时候/xiaoming.setState()就能改变小明现在的状态/就会触发xiaoming.notify()/就会把xiaoming.observers这个数组里面的每一个对象的请家长技能调用xiaoming.setState(玩手机)console.log(xiaoming)