创建对象的几种模式和一个事件管理器实现

2017-03-19  本文已影响0人  Carlmac

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

构造函数模式

function Person(name) {
  this.name = name;
}

Person.prototype.tellName = function() {
  alert('hello' + this.name);
}

var person = new Person('carl');
person.tellName();   // 'carl'

.

混合模式

function Person(name, gender) {
  this.name = name;
  this.gender = gender;
}
Person.prototype.sayName = function() {
  console.log(this.name);
}

function Coder(name, gender, language) {
  Person.call(this, name, gender);
  this.language = language;
}

Coder.prototype = Object.create(Person.prototype);

Coder.prototype.sayLanguage = function() {
  console.log(this.language);
}

var coder1 = new Coder('carl', 'male', 'JavaScript');
coder1.sayName();        // 'carl'
coder1.sayLanguage();    // 'JavaScript'

.

模块模式

var Person = (function() {
  var name = 'carl';
  function sayName() {
    console.log(name);
  }
  return {
    name: name,
    sayName: sayName
  }
})();

Person.sayName();   // 'carl'

.

工厂模式

function createPerson(name){
  var person = {
    name: name,
    tellName: function(){
      console.log(this.name);
    }
  };
  return person;
};

var person1 = createPerson('carl');
person1.tellName();   // 'carl'

.

单例模式

var Person = (function() {
  var instance;
  function init(name) {
    return {
      name: name
    }
  }
  return {
    createPerson: function(name) {
      if (!instance) {
        instance = init(name);
      }
      return instance;
    }
  }
})();

var person1 = Person.createPerson('carl');
var person2 = Person.createPerson('johnson');

console.log(person1.name);     // 'carl'
console.log(person2.name);     // 'carl'

.

发布订阅模式

var EventCenter = {

  var events = {};

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

  function off(e) {
    delete events[e];
  }

  return {
    on: on,
    fire: fire,
    off: off
  }
}

具体实现

function EventCenter() {
  this.events = {};
}

EventCenter.prototype.on = function(eventType, handler) {
  this.events[eventType] = this.events[eventType] || [];
  this.events[eventType].push({
    handler: handler
  });
}

EventCenter.prototype.fire = function () {
  var _args = [].slice.call(arguments);
  var eventType = _args.shift();
  if (!this.events[eventType]) return;
  var handlerArgs = _args;
  for (var i = 0; i < this.events[eventType].length; i++) {
    this.events[eventType][i].handler.apply(this, handlerArgs);
  }
}

EventCenter.prototype.off = function(eventType) {
  delete this.events[eventType];
}

Event.on('change', function(val){
    console.log('change...  now val is ' + val);  
});
Event.fire('change', 'hello');
Event.off('change');


var textInput = document.querySelector('#textIntput');
var btn = document.querySelector('#btn');
var result = document.querySelector('#result');

var Event = new EventCenter();

Event.on('change', function(val) {
  result.innerText = 'change... now value is ' + val;
 });

textInput.addEventListener('keyup', function() {
  Event.fire('change', textInput.value);
});

btn.addEventListener('click', function() {
  Event.off('change');
});

Demo

上一篇下一篇

猜你喜欢

热点阅读