zoukankan      html  css  js  c++  java
  • JavaScript中“单实例模式(单值模型)”的实现

    注:本文中部分描述都是操作我的书《JavaScript高级应用与实践》而言,还请朋友们多多支持我的书,详情请见:

    博主网站地址:

    http://m9m.3322.org/doc/js/md00.jsp

    “北京电子工业出版社”地址

    http://www.phei.com.cn/bookshop/bookinfo.asp?bookcode=TP061230%20&booktype=main 

    function Singleton()
    {
       // 不用new则执行if中的语句
       if(this == window)
          return Singleton._instance || (Singleton._instance = new Singleton());

       // .....这里可以放置你的其他代码

       // 用new时执行的语句
       return Singleton._instance || (Singleton._instance = this);
    }

    // 单实例的static静态获取函数
    Singleton.getInstance = function()
    {
        return Singleton._instance || (Singleton._instance = new Singleton());
    };

    Singleton.prototype.name = "xiatian";
    Singleton.prototype.dsp = function(){alert(this.name)};

    var oTest = Singleton.getInstance();
    oTest.dsp();
    oTest.name = "summer";

    // 可以他看出:new Singleton(),Singleton()或者Singleton.getInstance(),
    // 执行的结果相同,都是summer
    var oTest1 = Singleton();
    oTest1.dsp();

    另外的单值模型,则是利用闭包中变量的private特性来设计,它有个缺陷,就是不同的对象需要写不同的代码,
    而,上面的模型则比较通用些。如下所示:
    var Singleton = (function()
    {
      // private的变量
      var uniqueInstance,
      // private的方法
      constructor = function()
      {
        // ... 你可以在这里放许多你需要初始化的代码
      };
      // return和"{"之间的空格可以省略
      return{
        getInstance: function(func)
        {
          // 闭包函数特性:能访问前面定义的private变量和方法
          return uniqueInstance || (uniqueInstance = (func || constructor()))
          // 最后一个语句,也就是"}"前的一个语句的";"可以省略
        }
      }
    })();

    或者,改良针对不同的对象,这样就比上面两种更加通用了:
    var Singleton = new function()
    {
      // private的变量
      var uniqueInstance = [],
      // private的方法
      constructor = function()
      {
        // ... 你可以在这里放许多你需要初始化的代码
      };
      // return和"{"之间的空格可以省略
      return{
        getInstance: function(func)
        {
          // 闭包函数特性:能访问前面定义的private变量和方法
          // 同时利用对象作为数组下标,
          // 对象下标特性请见《JavaScript高级应用与实践》电子工业出版社出版,夏天编著
          return uniqueInstance[func] || (uniqueInstance[func] = (func || constructor)())
          // 最后一个语句,也就是"}"前的一个语句的";"可以省略
        }
      }
    };

    使用:
    var MyClass = function()
    {
       if(this == window)return new MyClass();
       this.name = "xiatian";
       this.dsp = function()
       {
          alert(this.name);
       };
    };
    var oTest = Singleton.getInstance(MyClass);
    oTest.name = "summer";
    oTest.dsp();

    var oTest1 = Singleton.getInstance(MyClass);
    oTest1.dsp();


    var MyClass1 = function()
    {
       if(this == window)return new MyClass();
       this.name = "xiatian";
       this.dsp = function()
       {
          alert(this.name);
       };
    };

    var oTest11 = Singleton.getInstance(MyClass1);
    oTest11.name = "summer2";
    oTest11.dsp();

    var oTest12 = Singleton.getInstance(MyClass1);
    oTest12.dsp();


    文章出处:http://www.diybl.com/course/1_web/javascript/jsjs/2008410/109068.html

  • 相关阅读:
    学习zabbix(一)
    学习openstack(七)
    并不对劲的bzoj3677:p3647:[APIO2014]连珠线
    并不对劲的bzoj5415:loj2718:uoj393:p4768:[NOI2018]归程
    并不对劲的bzoj5475:loj2983:p5206:[wc2019]数树
    并不对劲的多项式求ln,exp
    并不对劲的bzoj1758:p4292:[WC2010]重建计划
    (中等) UESTC 94 Bracket Sequence,线段树+括号。
    (简单) HDU 5154 Harry and Magical Computer,图论。
    (中等) UESTC 360 Another LCIS ,线段树+区间更新。
  • 原文地址:https://www.cnblogs.com/zjoch/p/1375652.html
Copyright © 2011-2022 走看看