<NME> wechat.js
<BEF> /*! CopyRight: sofish http://github.com/sofish/wechat.js, Licensed under: MIT */
;(function(global, doc) {

  var noop = function() {};

  // map 掉恶心的不统一的 api
  var Wechat = function() {
    this.calls = [];

    this.map = {
      events: {
        friend: 'menu:share:appmessage',
        timeline: 'menu:share:timeline',
        weibo: 'menu:share:weibo'
      },
      action: {
        friend: 'sendAppMessage',
        timeline: 'shareTimeline',
        weibo: 'shareWeibo'
        weibo: 'shareWeibo',
        email: 'email'
      },
      direct: {
        network: 'getNetworkType',
        hideToolbar: 'hideToolbar',
        hideOptionMenu: 'hideOptionMenu',
        showOptionMenu: 'showOptionMenu',

  // 有些 data 是延时获取的，这时候应该支持传入 callback
  Wechat.prototype._data = function(data) {
    for(var p in data) {
      if(!data.hasOwnProperty(p)) return;
      if(typeof data[p] === 'function') data[p] = data[p]();
    }

    // 接口命名统一
    data.app_id = data.app;
    data.img_url = data.img;

    delete data.app;
    delete data.img;

    return data;
  };

  // 处理数据接入
  Wechat.prototype._make = function _make(obj) {
    if(typeof WeixinJSBridge === 'undefined') {

      this.calls.push(obj);

      var make = function() {
        return _make(obj);
      };

      if(doc.addEventListener) return document.addEventListener('WeixinJSBridgeReady', make, false);

      // IE only
      doc.attachEvent('WeixinJSBridgeReady', make);
      doc.attachEvent('onWeixinJSBridgeReady', make);

      return;
    }

    // 直接获取的情况
    var direct = this.map.direct[obj.name];
    if(direct) {
      // 获取用户网络状态的返回值如下：
      // network_type:wifi wifi网络

      // Android 下有时候会需要 desc (*-.-)
      // network_type:wwan（2g或者3g）
      if(name === 'network') return WeixinJSBridge.invoke(direct, {}, callback);

      WeixinJSBridge.call(direct, callback);
    }

    // 分享到微博的接口不同
    if(name === 'weibo') {
      obj.content = obj.desc;
      obj.url = obj.link;

    // 朋友圈的 title 是不显示的，直接拼接
    } else if(name === 'timeline') {
      obj.title = obj.title + ': ' + obj.desc;

      // Android 下有时候会需要 desc (*U*)
      obj.desc = obj.title;
    }

    // 当 WeixinJSBridge 存在则直接绑定事件
    WeixinJSBridge.on(this.map.events[obj.name], function() {
      WeixinJSBridge.invoke(this.map.action[obj.name], obj, callback);
    });
  };

      // 图片预览/查看大图
      } else if(name === 'imagePreview') {
        return WeixinJSBridge.invoke(direct, data, callback);
      }

      return WeixinJSBridge.call(direct, callback);
    }
    
    // Email 直接处理
    if(name === 'email') return WeixinJSBridge.invoke('sendEmail', this._data(data, name), callback);

    var that = this;
    // 当 WeixinJSBridge 存在则直接绑定事件
    WeixinJSBridge.on(this.map.events[name], function() {
      WeixinJSBridge.invoke(that.map.actions[name], that._data(data, name), callback);
    return this;
  };

  // 对外只分享一个接口，不过会返回本身，可以有备用
  global.wechat = global.wechat || function() {
    var w = new Wechat();
    return w.on.apply(w, arguments);
  }

})(window, document);
  // 对外只分享一个接口，不过会返回本身，可以有备用
  var wx = new Wechat();

  // 创建唯一实例
  var entry = function() {
    return wx.on.apply(wx, arguments);
  };  

  //spm3 和 cortex 6.x 已经支持自动构建成module
  if (typeof exports !== 'undefined' && module.exports) {
    module.exports = exports = entry;
  } else if (typeof define === 'function') {
    define(function(require, exports, module) {
      module.exports = exports = entry;
    });
  } else {
    //浏览器端直接运行
    global.wechat = global.wechat || entry;
  }
  
  if(typeof WeixinJSBridge === 'undefined'){
    if(doc.addEventListener) {
      doc.addEventListener('WeixinJSBridgeReady', ready, false);
    } else {
      doc.attachEvent('WeixinJSBridgeReady', ready);
      doc.attachEvent('onWeixinJSBridgeReady', ready);
    }
  } else {
    ready();
  }

})(window, document);

<MSG> 第一个可用版本

<DFF> @@ -13,7 +13,7 @@
         timeline: 'menu:share:timeline',
         weibo: 'menu:share:weibo'
       },
-      action: {
+      actions: {
         friend: 'sendAppMessage',
         timeline: 'shareTimeline',
         weibo: 'shareWeibo'
@@ -28,42 +28,33 @@
 
   // 有些 data 是延时获取的，这时候应该支持传入 callback
   Wechat.prototype._data = function(data) {
+    var tmp = {};
+
     for(var p in data) {
       if(!data.hasOwnProperty(p)) return;
-      if(typeof data[p] === 'function') data[p] = data[p]();
+      tmp[p] = (typeof data[p] === 'function') ? data[p]() : data[p];
     }
 
     // 接口命名统一
-    data.app_id = data.app;
-    data.img_url = data.img;
+    tmp.appid = tmp.app;
+    tmp.img_url = tmp.img;
 
-    delete data.app;
-    delete data.img;
+    delete tmp.app;
+    delete tmp.img;
 
-    return data;
+    return tmp;
   };
 
   // 处理数据接入
-  Wechat.prototype._make = function _make(obj) {
-    if(typeof WeixinJSBridge === 'undefined') {
-
-      this.calls.push(obj);
-
-      var make = function() {
-        return _make(obj);
-      };
-
-      if(doc.addEventListener) return document.addEventListener('WeixinJSBridgeReady', make, false);
+  Wechat.prototype._make = function(obj) {
+    if(typeof WeixinJSBridge === 'undefined') return this.calls.push(obj);
 
-      // IE only
-      doc.attachEvent('WeixinJSBridgeReady', make);
-      doc.attachEvent('onWeixinJSBridgeReady', make);
-
-      return;
-    }
+    var name = obj.name
+      , direct = this.map.direct[name]
+      , data = obj.data
+      , callback = obj.callback;
 
     // 直接获取的情况
-    var direct = this.map.direct[obj.name];
     if(direct) {
       // 获取用户网络状态的返回值如下：
       // network_type:wifi wifi网络
@@ -72,25 +63,27 @@
       // network_type:wwan（2g或者3g）
       if(name === 'network') return WeixinJSBridge.invoke(direct, {}, callback);
 
-      WeixinJSBridge.call(direct, callback);
+      return WeixinJSBridge.call(direct, callback);
     }
 
     // 分享到微博的接口不同
     if(name === 'weibo') {
-      obj.content = obj.desc;
-      obj.url = obj.link;
+      data.content = data.desc;
+      data.url = data.link;
 
     // 朋友圈的 title 是不显示的，直接拼接
     } else if(name === 'timeline') {
-      obj.title = obj.title + ': ' + obj.desc;
+      data.title = data.title + ' - ' + data.desc;
 
-      // Android 下有时候会需要 desc (*U*)
-      obj.desc = obj.title;
+      // Android 下有时候会需要 desc (*-.-)
+      data.desc = data.title;
     }
 
+    var that = this;
+
     // 当 WeixinJSBridge 存在则直接绑定事件
-    WeixinJSBridge.on(this.map.events[obj.name], function() {
-      WeixinJSBridge.invoke(this.map.action[obj.name], obj, callback);
+    WeixinJSBridge.on(this.map.events[name], function() {
+      WeixinJSBridge.invoke(that.map.actions[name], data, callback);
     });
   };
 
@@ -112,10 +105,29 @@
     return this;
   };
 
+  // WeixingJSBridgeReady 后执行绑定的队列
+  var ready = function() {
+    for(var i = 0, len = wx.calls.length; i < len; i++) {
+      wx._make(wx.calls[i]);
+    }
+  };
+
   // 对外只分享一个接口，不过会返回本身，可以有备用
+  var wx = new Wechat();
+
   global.wechat = global.wechat || function() {
-    var w = new Wechat();
-    return w.on.apply(w, arguments);
+    return wx.on.apply(wx, arguments);
+  };
+
+  if(typeof WeixinJSBridge === 'undefined'){
+    if(doc.addEventListener) {
+      doc.addEventListener('WeixinJSBridgeReady', ready, false);
+    } else {
+      doc.attachEvent('WeixinJSBridgeReady', ready);
+      doc.attachEvent('onWeixinJSBridgeReady', ready);
+    }
+  } else {
+    ready();
   }
 
 })(window, document);

第一个可用版本