javaScript设计模式-单例

这篇具有很好参考价值的文章主要介绍了javaScript设计模式-单例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定义

确保一个类只有一个实例,并提供全局访问点。

原则

这个模式有三种不同的实现方式,每种都合理。但各有各的用处,其实用static类也可以实现相似的功能,不同的是单例是使用再创建,static是JVM加载时就创建。

实现

单例提供了将代码组织为一个逻辑单元的手段,它有许多用途:可以用来划分命名空间,以减少网页中全局变量的数目,可以用分支技术来封装浏览器间的差异化。在网页上使用全局变量有很大风险,而用单体对象创建的命名空间则是清除这些全局变量的最佳手段之一。

单体一般用字面量方式来实现(字面量是不可以被实例化的)。单体对象通常由两部分组成:方法和属性,以及用于访问它的变量,此变量通常是全局性,以便在网页的任务位置都可以被访问到。

使用单例有可能导致代码间的强耦合,有时创建一个可实例化的类更为可取。使用字面量时需要注意,可以在function这样的代码中用 : 的方式声明变量或方法,而在字面量的声明中不可以使用this.name=‘ld’这样的声明方式。

var MyNamespace = {
  findProduct: function(id) {
  }
  // Other methods can go here as well.
}
var MNS= MyNamespace; //当命名空间过长时可以用下面这种方式进行压缩 

/* 二次划分,可以把不同来源的代码封装在不同的命名空间内. */
var GiantCorp = {};
GiantCorp.Common = {
};
GiantCorp.ErrorCodes = {
};
GiantCorp.PageHandler = {
};

// Define a namespace without overwriting it if it already exists.
window.com = window.com || {};
com.example = com.example || {}; 
com.example.util = com.example.util || {};

实现方式—立即执行

var MyNamespace = {};
MyNamespace.Singleton = {};
MyNamespace.Singleton = (function () {
// Private members.
    var privateAttribute1 = false;
    var privateAttribute2 = [1, 2, 3];
    return {
// Public members.
        publicAttribute1: true,
        publicAttribute2: 10,
        publicMethod1: function () {
        },
        publicMethod2: function (args) {
        }
    };
})(); //加载后立即执行,用闭包实现了私有化
var t = MyNamespace.Singleton();

实际方式—惰性加载

如果需要加载大量的数据,可以用这种加载方式。而那些用来定义命名空间或某个页页专有的代码建议采用立即执行的方式。这种加载方式的特别之处在于,对它们的访问必须借助一个静态方法。

var MyNamespace = {};
MyNamespace.Singleton = (function() {
    // Private attribute that holds the single instance.
    var uniqueInstance;
    function constructor() {
        // Private members.
        var privateAttribute1 = false;
        var privateAttribute2 = [1, 2, 3];
        function privateMethod1() {}
        function privateMethod2(args) {}

        return { // Public members.
            publicAttribute1: true,
            publicAttribute2: 10,
            publicMethod1: function() {
            },
            publicMethod2: function(args) {
            }
        }
    }

    return {
        getInstance: function() {
            // Instantiate only if the instance doesn't exist.
            if(!uniqueInstance) {
                uniqueInstance = constructor();
            }
            return uniqueInstance;
        }
    }
})();
var t = MyNamespace.Singleton.getInstance();

分支

是一种用来把浏览器间的差异封装在运行期间进行设置的动态方法中的技术。如果不用分支技术,那么每次调用这个方法时,所有那些浏览器嗅探代码都要运行一次。能在运行期间动态确定函数代码的能力,正是JS的灵活之处。把它归为单例是因为这些差异一般不会改变,实现一次加载,节约资源的目的。文章来源地址https://www.toymoban.com/news/detail-802964.html

var SimpleXhrFactory = (function() {
  var standard = {
    createXhrObject: function() {return new XMLHttpRequest();}
  };
  var activeXNew = {
    createXhrObject: function() {return new ActiveXObject('Msxml2.XMLHTTP');}
  };
  var activeXOld = {
    createXhrObject: function() {return new ActiveXObject('Microsoft.XMLHTTP');}
  };
  var testObject;
  try {
    testObject = standard.createXhrObject();
    return standard;
  }
  catch(e) {
    try {
      testObject = activeXNew.createXhrObject();
      return activeXNew; 
    }
    catch(e) {
      try {
        testObject = activeXOld.createXhrObject();
        return activeXOld;
      }
      catch(e) {
        throw new Error('No XHR object found');
      }
    }
  }
})();

到了这里,关于javaScript设计模式-单例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript 设计模式之代理模式

    其实这种模式在现在很多地方也都有使用到,如 Vue3 中的数据相应原理就是使用的 es6 中的 Proxy 代理及 Reflect 反射的方式来处理数据响应式 我们日常在使用数据请求时,也会用到一些代理的方式,比如在请求不同的域名,端口等会出现跨域的情况,这时就需要用到代理去获

    2024年02月19日
    浏览(37)
  • JavaScript 设计模式之组合模式

    在我们日常中肯呢个会将一个表单用这种模式来创建 先写一个基类,再继承该基类 首先我们创建一个基类 定义 接下来创建一个容器 注意,这里的 show 方法就是用来将所有的 dom 追加到页面上 下面创建一系列的 form 相关 item 及一些dom 使用  假使页面中存在 dom  js 效果 组合模

    2024年02月22日
    浏览(40)
  • javaScript设计模式-工厂

    它的好处是消除对象间的耦合度,在派生子类时提供了更大的灵活性。但盲目的把普通的构造函数扔在一边,并不值得提倡。如果要采一不可能另外换用一个类,或都不需要在运行期间在一系列可互换的类中进行选择,就不应该使用。这样在后期代码重构时还有机会使用。

    2024年01月20日
    浏览(44)
  • JavaScript设计模式详解

    JavaScript设计模式是解决软件设计中常见问题的可重复使用的解决方案。本博客将深入探讨JavaScript设计模式的各个方面,包括设计模式的类别、创建型、结构型、行为型、并发型和架构型设计模式。 设计模式是一种在软件设计中解决常见问题的可重用解决方案。它们是经过验

    2024年01月19日
    浏览(39)
  • javascript设计模式-组合

    组合模式 是一种专为创建WEB上的动态用户界面而量身定制的模式。使用它,可以用一条命令在多个对象上激发复杂或递归行为,那些复杂行为被委托给各个对象。前提是每个对象必须实现相同的接口。接口检查越严格,其稳定性越高。 可以用同样的方法处理对象的集合与其

    2024年01月21日
    浏览(33)
  • javascript设计模式-责任链

    责任链 可以用来消除请求的发送者和接收者之间的耦合,这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的。链中的每个对象可以处理请求,也可以将其传给下一个对象。JS内部就使用了这种模式来处一事件捕获和冒泡问题。一般的结构如下: 发送者知道链

    2024年01月23日
    浏览(29)
  • javascript设计模式-应用示例

    有些时候为了适应没的场景,有些代码没必要每次调用时都进行一次环境判断,所以可以memoizing技术动态改写运行中代码的实现。 发起多个请求,程序会自动缓存,并通过setTimeOut重复调用。 这个例子充分应用了通道方法,利用此模式应该可以做到AOP的功能。

    2024年01月23日
    浏览(30)
  • javascript设计模式-装饰者

    基本实现 是一种为对象增加我的技术,它并不使用创建新子类手段,一切都在动态完成。这个过程相对于使用者来说是透明的。透明地把对象包装在具有同样接口的另一个对象之中。 比如可以动态的为自行车对象添加可选的特色配件上。比如添加4个选件,可以新定义4个超类

    2024年01月22日
    浏览(38)
  • JavaScript中的设计模式

    本文作者为 360 奇舞团前端开发工程师 JavaScript 设计模式是编程世界的智慧结晶,提供了解决常见问题的优秀方案。无论你是初学者还是经验丰富的开发者,掌握这些模式都能让你的代码更清晰、更灵活。本文将为你介绍一些常见的设计模式,帮助你提高代码质量,构建更可

    2024年02月21日
    浏览(31)
  • JavaScript 设计模式之享元模式

    将一部分共用的方法提取出来作为公用的模块 享元模式的应用目的是为了提高程序的执行效率与系统的性能。因此在大型系统开发中应用是比较广泛的,有时可以发生质的改变。它可以避免程序中的数据重复。有时系统内存在大量对象,会造成大量存占用,所以应用享元模式

    2024年02月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包