jackdizhu 主页
设计模式
                // ----工厂模式--------------------------------------------
                var Car = (function () {
                    var Car = function (model, year, miles) {
                        this.model = model;
                        this.year = year;
                        this.miles = miles;
                    };
                    return function (model, year, miles) {
                        return new Car(model, year, miles);
                    };
                })();

                var tom = new Car("Tom", 2009, 20000);
                var dudu = new Car("Dudu", 2010, 5000);
                // ----观察者模式(订阅)----------------------------
                var __ = {};  // 定义发布者
                (function (q) {
                  var list = [], //回调函数 数组
                    subUid = -1; //回调函数 对应 id ++ 从0 开始
                  // 发布消息,遍历订阅者
                  q.target = function (type, content) {
                    // type 为订阅类型,content为订阅内容
                    // 如果没有订阅,直接返回
                    if (!list[type]) {
                      return false;
                    }
                    setTimeout(function () {
                      var ons = list[type],
                        len = ons ? ons.length : 0;

                      while (len--) {
                        // 将内容注入到订阅者那里
                        ons[len].func(type, content);
                      }
                    }, 0);
                    return true;
                  };
                  //订阅方法,由订阅者来执行
                  q.on = function (type, func) {
                    // 如果之前没有订阅过
                    if (!list[type]) {
                      list[type] = [];
                    }
                    // _id 订阅者的id
                    var _id = (++subUid).toString();
                    // push 到订阅数组
                    list[type].push({
                      _id: _id,
                      func: func
                    });
                    return _id;
                  };
                  // 取消 订阅方法
                  q.unon = function (_id) {
                    for (var m in list) {
                      if (list[m]) {
                        for (var i = 0, j = list[m].length; i < j; i++) {
                          if (list[m][i]._id === _id) {
                            list[m].splice(i, 1);
                            return _id;
                          }
                        }
                      }
                    }
                    return false;
                  };
                } (__));

                // 将订阅赋值给一个变量,以便 取消
                var girlA = __.on('tap', function (type, content) {
                  console.log('girlA on '+type + ": ----:" + content);
                });
                var girlB = __.on('tap', function (type, content) {
                  console.log('girlB on '+type + ": ----:" + content);
                });
                // 发布消息
                __.target('tap', '通知--1');
                // 输出:
                //girlA 取消 订阅
                setTimeout(function () {
                  __.unon(girlA);
                }, 0);
                // 发布消息
                __.target('tap', "通知--2");