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/

     

  • 相关阅读:
    数据结构上机思考
    hdu1005,循环节
    网络赛总结
    icpc沈阳网络赛。cake cake!
    树的基础代码
    网络赛第一场
    欧拉函数
    欧拉函数
    多校第十场
    (环上)最大子段和
  • 原文地址:https://www.cnblogs.com/floatboy/p/module_1.html
Copyright © 2011-2022 走看看