用Es6的写法来,理解node.js的单例模式

单例模式,其实就是Js利用闭包来实现一个在内存存放一个持久的变量

class test{   // js单例模式则是利用闭包来完成
    constructor(name){
        this.name = name
        this.ii = null
     
  
    }
    static getInstance(name){
        if(!this.ii){
            this.ii = new test(name)
        }else{
            return this.ii
        }
     
    }
}

// console.log(new test().getInstance('gyc'))
先开始我调试调用是这个样子去调用 getinstance方法,当我百度了一下static的意思后发现其实他的意思是

静态方法调用直接在类上进行,不能在类的实例上调用。静态方法通常用于创建实用程序函数。

test.getInstance('gtyc1') 所以他的调用方法是直接在其类上调用

console.log(test.getInstance('gtyc1'))
console.log(test.getInstance('213111'))
console.log(test.getInstance('213213'))

当按着顺序去console的时候发现他的输出其实是 undefined ,gtyc1,gtyc1 第一次去调用的时候是因为还没有进行实例化,第二次 第三次则是实例化完成了所以会打印出来‘gtyc1’,这就是单例

其实把上面的代码可以在进行拆分一下,写成下面这种对没有学过static关键字的看起来比较容易懂一些

class t1{
    constructor(name){
        this.name = name
        this.ii = null
    }
}

function getii(name) {
    if(!t1.ii){
        t1.ii = new t1(name)
    }else {
        return t1.ii
    }
}
console.log(getii('222'))
console.log(getii('333'))
console.log(getii('444'))

其打印结果也是undefined ,222,222

事件驱动,顾名思义就是用事件运行代码。如在前端,我定义了一个Btn按钮,给他绑定了一个事件,如果一百年以内没有人点过这个按钮那么他的事件就不会被触发,他的内部程序就不会运行,所以这个理念用到node.js也是ok的。但是node没有html那种定义事件的btn怎么办??
于是就有了events这个模块,他的主要功能就是绑定事件。

在node.js中有一个events模块,是事件驱动型,类似于我前端建立了一个btn事件,然后再规定的时间触发了这个btn事件

仿写node.js的events模块中的on方法和emit方法

如何去用Events模块来写。

var events = require('events'); //先引用

var ObServer = new events.EventEmitter(); 

ObServer.on('MyBtnName',  function (res) {
	console.log(res)   //第一个参数MyBtnName就是你绑定得名字可以说是一个key值
//function得res应该不用解释了把,这个是回调,也就是你触发时候传入得参数
})

//触发这个事件
ObServer.emit('MyBtnName','我是测试');
//第一个参数则是你绑定得事件,后面传入得参数在MyBtnName得回调里面可以获取

以上是官网模块得基本调用方法,接下来我们可以写一个简单得,监听方法和触发方法

class EventsGyc {
    constructor(){
        this._events = this._events ||new Map  //Map是Map对象
        this.maxlength = this.maxlength || 10  //这个不出意外应该是最大能监听10或者自己设置
    }
}  

先定义一个类,EventsGyc等同于events类

//这个时候在其原型上添加方法
EventsGyc.prototype.emit = function(name,...args){
    let data = this._events.get(name);
    if(args.length>0){
        data.apply(this,args) //回调
    }else {
        data.call(this) //回调
    }
    return  true;
}

这个是触发方法,其核心主要得是在这个回调,这个回调很灵性

EventsGyc.prototype.on = function(name,fn){
    if(!this._events.get(name)){  //name属于key值
        this._events.set(name,fn);
    }
}

//监听事件,做要是把name当作key,fn参数当成数据,存放在Map集合中。

这个时候监听和绑定事件都写好,我们可以写写例子试试跑跑

let EventGyc = new EventsGyc();  //观察者模式其实,就是在函数得原型链上进行保存。

EventGyc.on('gyc',function (res,res1,res2,rew3) {  //创建一个gyc事件
    console.log(res)
    console.log(res1,res2,rew3)
})
EventGyc.emit('gyc','2222','2331','4444','1111'); // 触发gyc事件并且传入四个参数

事件驱动得原理大概清楚了一些,写下来分享个人得拙见,在我得理解里面,事件驱动就是在事件得原型上进行操作,把name和参数当作数据保存在原型得map集合中,每当被触发得时候则就需取出参数当作回调传回给on函数

猜你喜欢

转载自blog.csdn.net/a519637560/article/details/106137806