美文网首页
web前端-js设计模式

web前端-js设计模式

作者: 抚年华轻过 | 来源:发表于2017-09-22 16:54 被阅读0次

    1、写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。

    1、设计模式分类:
    1. 构造函数模式(constructor)
      含义:创建一个构造函数
    function Person(name,age){
      this.name=name;
      this.age=age;
    }
    Person.prototype.sayName=function(){
       return this.name;
    }
    var student=new Person("Ethan",28);
    
    1. 工厂模式(factory)
      含义:通常是一个函数return出来一个新的对象
    function createPerson(name){
      var person={
        name: name,
        sayName:function(){
           return this.name;
         }
      }
      return person;
    }
    createPerson("Ethan");
    this回顾:
    1、方法调用模式:createPerson("Ethan").sayName(); this指向person
    2、函数调用模式: var t=createPerson("Ethan").sayName;   this指向window
    3、new构造对象:this指向新构造的对象
    4、自动指向:apply,call,bind方法
    
    1. 单例模式(singleton)
      含义:每次调用这个模式不会去创造,有且只有一个(例子:组件生成的对话框,一个页面只出现一次)
    var People=(function(){
      var instance;
      function init(name){
        return {
           name: name
        }
      }
      return {
        createPeople:function(name){
           if(!instance){
             instance=init(name);
           }
           return instance;
        }
      }
    })();
    //函数作用域:词法作用域,js作用域由function所体现,function访问的上下文由它所在定义的位置所决定
    People.createPeople("Ethan");
    People.createPeople("age");
    
    1. 混合模式(mixin)
      含义:对某个对象,增加新的东西(一般都用来混合它的原型)
    function People(name,age){
      this.name=name;
      this.age=age;
    }
    People.prototype.sayName=function(){
      console.log(this.name);
    }
    var Student=function(name,age,score){
      People.call(this,name,age);
      this.score=score;
    }
    //用原生js方法将student.prototype指向People
    Student.prototype=create(People.prototype);
    
    function create(parentObj){
      function F(){}
      F.prototype=parentObj;
      return new F;
    }
    Student.prototype.sayScore=function(){
      console.log(this.score);
    }
    var student=new Student("Ethan","28","97")
    
    1. 模块模式(module)
      含义:一般通过闭包的方式实现的,特点:避免全局变量的冲突
    var Person=(function(){
      var name="Ethan";
      function sayName(){
        console.log(name);
      }
      return: {
        name: name,
        sayName:sayName
      }
    })();
    
    1. 订阅发布模式(subcribe/publish)
      含义:先订阅后发布,相当于事件监控模式,先定义好函数,再在任何时候异步同步触发事件
    var EventCenter=(function(){
      var events={};    //存储所有的key/value
      //events={"hello":[{function(){}:function(){}},{function(){}:function(){}},...]}
      function on(evt,handle){
        events[evt]=events[evt] || [];
        events[evt].push({
          handle:handle
        });
        //events["hello"]=[{handle:handle}]
      }
      function fire(evt,args){
        if(!events[evt]) return;
        for(var i=0;i<events[evt].length;i++){
          events[evt][i].handle(args);
        }
      }
    function off(name){
        delete events[name];
      }
      return {
        on:on,
        fire:fire,
        off:off
      };
    })();
                     
    EventCenter.on("hello",function(word){
      console.log(word);
    });
    EventCenter.fire("hello","word");
    

    2、使用发布订阅模式写一个事件管理器,可以实现如下方式调用

    Event.on('change', function(val){
        console.log('change...  now val is ' + val);  
    });
    Event.fire('change', 'Ethan');
    Event.off('changer');
    
    var Event=(function(){
      var events={};    //存储所有的key/value
      //events={"hello":[{function(){}:function(){}},{function(){}:function(){}},...]}
      function on(evt,handle){
        events[evt]=events[evt] || [];
        events[evt].push({
          handle:handle
        });
        //events["hello"]=[{handle:handle}]
      }
      function fire(evt,args){
        if(!events[evt]) return;
        for(var i=0;i<events[evt].length;i++){
          events[evt][i].handle(args);
        }
      }
    function off(name){
        delete events[name];
      }
      return {
        on:on,
        fire:fire,
        off:off
      };
    })();
    
    Event.on('change', function(val){
        console.log('change...  now val is ' + val);  
    });
    Event.fire('change', 'Ethan');
    Event.off('change');
    

    (mission 6)

    相关文章

      网友评论

          本文标题:web前端-js设计模式

          本文链接:https://www.haomeiwen.com/subject/kmmbsxtx.html