单例模式--js

本文深入探讨了单例模式的实现原理及其在JavaScript中的应用。介绍了如何确保特定类仅有一个实例,并在后续创建相同类的对象时返回首次创建的对象。讨论了使用全局变量、构造函数静态属性及闭包等不同实现方式及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单体(单例)模式的实现在于保证一个特定类仅有一个实例,意味着当第二次使用同一个类创建新对象时,应该得到第一个所创建对象完全相同对象。

new操作符:

    单体思想是,当使用同一个构造函数以new操作符来创建多个对象时,应该仅获得指向完全相同的对象的新指针。

实现方法:

1、可以使用全局变量来存储该实例,但是并不推荐使用这种方法,因为在一般原则下,全局变量是有确定啊的,此外,任何人都能f覆盖该全局变量,即使是意外事件。

2、可以在构造函数的静态属性中缓存该实例。js的函数也是对象,因为他们也可以有属性。可以设置一个属性并将实例缓存到这个实例中。但唯一的缺点是:该静态属性是公开可访问的的属性,在外部代码中可能会修改该属性。

3、可以将实例包装到闭包中,这样可以保证该实例的私有性并且保证该实例不会被构造函数之外的代码所修改,代价是会带来额外的闭包开销。

下面,我们看看第二种和第三种的实现:

静态属性中的实例:

function Univerce(){
    	// 我们有一个现有的实例吗?
    	if(typeof Univerce.instance==="object"){
    		return Univerce.instance;
    	}
    	// 正常进行
    	this.start_time=0;
    	this.bang="big";
    	// 缓存
    	Univerce.instance=this;
    	return this;
    }
    // 测试
    var uni=new Univerce();
    var uni2=new Univerce();
    console.log(uni==uni2)	//true

缺点是:该静态属性是公开可访问的的属性,在外部代码中可能会修改该属性。

闭包中的实例:

var Universe;
	(function(){
		var instance;
		Universe=function Universe(){
			if(instance){
				return instance;
			}
			instance=this;
			// 所有功能
			this.start_time=0;
			this.bang="big";
		}
	})();
	var uni=new Universe();
	var uni1=new Universe();
	console.log(uni1)
	console.log(uni==uni1)
带来额外的闭包开销。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值