zoukankan      html  css  js  c++  java
  • js设计模式--单体模式

    GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自《松本行弘的程序世界》).

    单体模式:

      单体(Singleton)模式的思想在于保证一个特定类仅有一个实例。当在第二次使用同一个类创建新对象的时候,和第一次创建对象完全相同对象。

      当使用new语法通过构造函数来创建对象,仅仅获得的是指向完全相同的对象的新指针:

      例:

    function uniFn(){};
    
    var uni1 = new uniFn();
    
    var uni2 = new uniFn();
    
    uni1.constructor === uni2.constructor; //true  指向的是同一个构造函数

      使用对象字面量创建一个单体:

    var obj = {
       
       first:"单体",
       two:function(){}  
              
    };

      js中是没有类的概念,只有对象。当创建一个新对象的时,实际上没有其他对象与其类似,新对象已经是单体了。

    var obj1 = {
       
       first:"单体",
    
       two:function(){}  
              
    };
    
    var obj2 = {
       
       first:"单体",
    
       two:function(){}  
              
    };
    
    obj1 == obj2; //false   即便是创建完全相同成员的同类对象,他们也是不想等的。
    obj1 === obj2; //false

     通过闭包实现单体的方法,这个秘诀在与重写构造函数:

    function example(){
    
      //缓存实例   
    var instans = this;     this.name = "_this";
      //重写构造函数   example
    = function(){ return instans; }; }; var exa = new example(); var exa2 = new example(); console.log(exa == exa2); //true console.log(exa == exa2);//true

     如果需要使原型和构造函数指针按照预期的那样运行,可以通过调整实现这个目标:

    function example(){
    
      //缓存实例   
      var instans;
    
      //重写构造函数
      example = function(){ return instans; };
        //保留原型属性
        example.prototype = this;
        //实例
        instans = new example();
        //重置构造函数指针
        instans.constructor = example;
    
        //功能
    
         this.name = "_this";
        return instans;
    };
    
    example.prototype.nothing = true;
    
    var exa = new example();
    
    example.prototype.evething = true;
    
    var exa2 = new example();
    
    console.log(exa === exa2);  //true
    
    //所有属性都起作用
    
    console.log(exa.nothing && exa2.evething && exa.nothing && exa2.evething);  //true
    
    //构造函数的指针
    
    console.log(exa.constructor === example) //true

    理解的并不够深刻,总结一遍,加强不少印象。

    参考《javascript模式》

    腾讯web前端团队:http://www.alloyteam.com/2012/10/common-javascript-design-patterns/

     

  • 相关阅读:
    51nod-1420-贪心
    51nod-1455-dp/缩小范围
    51nod-1574-排列转换
    简单的鼠标滚轮事件
    数组去重
    模仿jq里的选择器和color样式
    在页面里写个动态本地时间
    使用css中的flex布局弹性手风琴效果
    bootstrap中如何多次使用一个摸态框
    使用css让文字两端对齐
  • 原文地址:https://www.cnblogs.com/floatboy/p/module_1.html
Copyright © 2011-2022 走看看