js类的单例(懒汉和恶汉模式)

首先问大家一个问题,类的静态属性你会写吗?

哈哈哈,笔者今天被同事问蒙了,什么是静态属性啊。

// ES5 >>>
function Demo(){
}
Demo.sayHello = "Hello";

//  ES6  >>>
class Demo{
    static sayHello = "Hello"
}

sayHello就是Demo的静态属性,是不是给你唬住了。

所谓的单例其实就是保持只允许有一个单独的实例,甚至你写一个

var a = 10;

你能保证他是唯一的,那他就是一个单例,这种官面话大家去看别的帖子也都有的是,我就不墨迹了,下面是恶汉模式(无论你需不需要用到这个实例,他都会创建出来)的写法:

function Ddd(){
    conosle.log("我是ES5恶汉模式的写法");
}
Ddd.prototype.sayName = function(){
    console.log("我是恶汉")
}
Ddd.prototype.sayAge = function(){
    console.log("我23啦")
}
Ddd.EvilMan = new Ddd();

Ddd.EvilMan.sayName();
Ddd.EvilMan.sayAge();




class Ddd{
    static EvilMan = new Ddd();
    sayName(){
        console.log("我是恶汉ES6")
    }
    sayAge(){
        console.log("我比他大一岁")
    }
    constructor(){
        console.log("我是恶汉ES6的写法")
    }
}
Ddd.EvilMan.sayName();

无论你调没调用sayName方法,只要你把这个类引进来了,他就已经创建出来实例化的对象了,将实例化的对象复制给自身的静态属性,所以也就意味着你还没用但是constructor函数就已经会执行了,而懒汉模式是你必须要调用某个方法时,他才会去检测是否有没有这个实例。

class Ddd{
    constructor(){
        this.init();
        this.Instance = null;
    }
    init(){
        console.log("我是懒汉,我有点懒")
    }
    sayName(){
        console.log("我是懒汉")
    }
    static getInstance(){
        if(!this.Instance){
            this.Instance = new Ddd();
        }
        return this.Instance;
    }
}
Ddd.getInstance().sayName();

其实也很好理解,恶汉模式赋值给静态属性的时候就已经实例化对象了,所以无论你用不用实例化的方法实例化的对象都已经存在了,懒汉恰恰相反,只有你在用静态方法的时候他才会去实例化对象,所以也就是保证了啥时候用啥时候实例化了,具体应用要看项目,理解起来不难,实际应用才是最难的,而且这些写法其实也都只是一种约定罢了,就像es5你声明类开头字母就要大写一样,你写单例类,如果就是有人不调用你静态属性或者静态方法,非要去new,那你就保证不了这个是一个单例类,所以还要加上各种约束,例如将constructor设置成静态属性来保证new的操作不会有用等,看自己应用了,究竟是约定大于约束呢,还是约束大于约定呢,这是一个问题,哈哈哈哈

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值