JS 单例模式

发布于 2025-01-21 04:29:42 字数 1399 浏览 0 评论 0

当我们不希望每次使用的时候都要新建一个实例对象,我们需要使用这种方法。

现在考虑一个问题:

var fun = function(){}
var fun1 = new fun();
var fun2 = new fun();
console.log(fun1 === fun2); 

我们要返回 true,该怎么做呢?

第一种

var obj = {};
function fun(){ return obj;}
var fun1 = new fun();
var fun2 = new fun();
console.log(fun1 === fun2); //ture

第二种

var fun = function (){
  if(fun.ins) return fun.ins;
  return fun.ins = this;
}

这种方式主要是通过给函数体绑一个静态属性,通过将第一次 new 时候的 this 传给创建的静态属性,然后在第二次返回的是静态属性的值

第三种

var fun = function (){
  var instance = this;  //缓存实例
  fun = function(){    //重构函数
    return instance;
  } 
}

仔细看的话会发现其实形成了一个闭包,内部函数使用了外部的私有变量,导致垃圾回收机制不会回收 instance

应用场景

JS 单例模式

function fun(arg){
    if(fun.ins) return fun.ins;
    this.a = arg.a || 111;
    this.b = arg.b ||222;
    this.say = function(){
        console.log(this.a,this.b);
    }
    return fun.ins = this;
}

new fun({
    a: 1,
    b : 2
}).say()

new fun({
    a: 2,
    b:1
}).say()

两次返回的值相同,这是因为第二次 new 的时候其实调用的是第一次的 this

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

笑梦风尘

暂无简介

文章
评论
25 人气
更多

推荐作者

白云不回头

文章 0 评论 0

糖粟与秋泊

文章 0 评论 0

洋豆豆

文章 0 评论 0

泛滥成性

文章 0 评论 0

mb_2YvjCLvt

文章 0 评论 0

夜光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文