前端设计模式

2017-07-13  本文已影响14人  任少鹏

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

var People = (function(){
    var instance;
    function init() {
        //define private methods and properties
        //do something
        return {
            //define public methods and properties
        };
    }
    return {
        createPeople: function() {
            if (!instance) {
                instance = init();
            }
            return instance;
        }
    };
}());
var obj1 = People.createPeople();
var obj2 = People.createPeople();
function Person(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.sayName = function(){
  return this.name;
};
var student = new Person("xiaoming", 14);
function createPerson(opts){
     var person = {
       name: opts.name||'小明'
     };
     person.sayName: function(){
       console.log(this.name);
     }
     return person;
   }
//函数的封装:把相同的代码放在一个函数中
   var p1 = createPerson({name:'张三'});
   var p2 = createPerson({name: '李四'});
var Person = (function(){
    var name = 'ruoyu';
//下面函数是私有的,但可以被公开函数访问
    function sayName(){
        console.log(name);
    }
// 返回一个对象赋予Person   
    return {
        name: name,
        sayName: sayName
    }
})();
Person.name;
Person.sayName();
var Person = function(name, age) {
    this.name = name;
    this.age = age;
};
Person.prototype.sayName = function(){
  console.log(this.name);
}
var Student = function(name, age,  score) {
    Person.call(this, name, age);
    this.score = score;
};
//Student.prototype = Object.create(Person.prototype);
Student.prototype = create(Person.prototype);
function create (parentObj){
    function F(){}
    F.prototype = parentObj;
    return new F();
};
Student.prototype.sayScore = function(){
  console.log(this.score);
}
var student = new Student(" 小明", 15, 90);
console.log(student);
var EventCenter = (function(){
  var events = {};  
  /*
    {
      my_event: [{handler: function(data){xxx}}, {handler: function(data){yyy}}]
    }
  */

  function on(evt, handler){
    events[evt] = events[evt] || [];
    events[evt].push({
      handler: handler
    });
  }

  function fire(evt, args){
    if(!events[evt]){
      return;
    }
    for(var i=0; i<events[evt].length; i++){
      events[evt][i].handler(args);
    }
  }

  function off(evt){
        delete events[evt]
    }
  return {
    on: on,
    fire: fire,
    off: off
  }
})();
EventCenter.on('my_event', function(data){
  console.log('my_event received...');
});
EventCenter.on('my_event', function(data){
  console.log('my_event2 received...');
});
EventCenter.fire('my_event');
EventCenter.on('change', function(val){
    console.log('change...  now val is ' + val);  
});
EventCenter.fire('change', '饥人谷');
EventCenter.off('change');

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

Event.on('change', function(val){
    console.log('change...  now val is ' + val);  
});
Event.fire('change', '饥人谷');
Event.off('changer');
var Event=(function(){
    var events={};
    function on(evt,handler){
        events[evt]=events[evt] || [];
        events[evt].push({
            handler:handler
        })
    }
    function fire(evt,arg){
        if(!events[evt]){
            return 
        }
        for(var i=0;i<events[evt].length;i++){
            events[evt][i].handler(arg)
        }
    }
    function off(evt){
        delete events[evt];
    }
    return {
        on:on,
        fire:fire,
        off:off
    }
}());

Event.on('change', function(val){
    console.log('change...  now val is ' + val);  
});
Event.fire('change', '饥人谷');
Event.off('changer');
上一篇下一篇

猜你喜欢

热点阅读