剛剛數了一下,cordova.js中定義了17個模塊,下面慢慢來看這17個模塊。javascript
先看比較獨立的模塊,一些工具模塊。html
1. cordova/urlutiljava
模塊輸出的對象包含一個方法makeAbsolute,把地址轉化爲絕對地址。node
//mark
define("cordova/urlutil", function(require, exports, module) { exports.makeAbsolute = function makeAbsolute(url) { var anchorEl = document.createElement('a'); anchorEl.href = url; return anchorEl.href; }; });
2. cordova/utils數組
這個模塊的方法比較多服務器
// file: src/common/utils.js define("cordova/utils", function(require, exports, module) { var utils = exports; //爲obj對象的key屬性添加get/set 方法 //Object, defineProperty/__defineGetter__/__defineSetter__ utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) { if (Object.defineProperty) { var desc = { get: getFunc, configurable: true }; if (opt_setFunc) { desc.set = opt_setFunc; } Object.defineProperty(obj, key, desc); } else { obj.__defineGetter__(key, getFunc); if (opt_setFunc) { obj.__defineSetter__(key, opt_setFunc); } } }; utils.defineGetter = utils.defineGetterSetter; //Array, indexOf utils.arrayIndexOf = function(a, item) { if (a.indexOf) { return a.indexOf(item); } var len = a.length; for (var i = 0; i < len; ++i) { if (a[i] === item) { return i; } } return - 1; }; //Array, splice utils.arrayRemove = function(a, item) { var index = utils.arrayIndexOf(a, item); if (index !== -1) { a.splice(index, 1); } return index !== -1; }; //輸出對象類型 "[object type]" utils.typeName = function(val) { return Object.prototype.toString.call(val).slice(8, -1); }; utils.isArray = function(a) { return utils.typeName(a) === 'Array'; }; utils.isDate = function(d) { return utils.typeName(d) === 'Date'; }; //複製對象,深度克隆對象 utils.clone = function(obj) { //注意的地方, typeof [Date|Array|正則] is object if ( !obj || typeof obj === 'function' || utils.isDate(obj) || typeof obj !== 'object') { return obj; } //遞歸調用 var retVal, i; //數組拷貝 if (utils.isArray(obj)) { retVal = []; for (i = 0; i < obj.length; ++i) { retVal.push(utils.clone(obj[i])); } return retVal; } //對象拷貝 retVal = {}; for (i in obj) { if (! (i in retVal) || retVal[i] != obj[i]) { retVal[i] = utils.clone(obj[i]); } } return retVal; }; //Returns a wrapped version of the function, aplly/call, 設置方式執行的上下文環境 utils.close = function(context, func, params) { if (typeof params === 'undefined') { return function() { return func.apply(context, arguments); }; } else { return function() { return func.apply(context, params); }; } }; //prototype, constructor, 這兩個對於理解js繼承的很是重要 utils.extend = (function() { // proxy used to establish prototype chain var F = function() {}; // extend Child from Parent return function(Child, Parent) { F.prototype = Parent.prototype; Child.prototype = new F(); Child.__super__ = Parent.prototype; Child.prototype.constructor = Child; }; } ()); utils.alert = function(msg) { /*if (window.alert) { window.alert(msg); } else if (console && console.log) {*/ console.log(msg); // } }; utils.createUUID = function() { return UUIDcreatePart(4) + '-' + UUIDcreatePart(2) + '-' + UUIDcreatePart(2) + '-' + UUIDcreatePart(2) + '-' + UUIDcreatePart(6); }; //返回相應的16進制數字 function UUIDcreatePart(length) { var uuidpart = ""; for (var i = 0; i < length; i++) { var uuidchar = parseInt((Math.random() * 256), 10).toString(16);//mark if (uuidchar.length === 1) { uuidchar = "0" + uuidchar; } uuidpart += uuidchar; } return uuidpart; } });
1). defineGetterSetter, 參數obj, key, getFunc, opt_setFunc,爲obj的key屬性定義存取方法。app
實現中有幾個方法值得注意一下,Object.defineProperty和__defineGetter__(__defineSetter__),後面那個是非標準的方法。developer.mozilla.org上講的很詳細了,下面是連接dom
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/definePropertyjsp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__工具
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__
2). arrayIndexOf ,參數a, item,找索引,這個很簡單。
3). arrayRemove,參數a, item,刪除數組中的某個索引。
4). typeName、isArray、isDate,判斷變量類型。
5). clone,變量複製,注意值類型和引用類型的區別就好了。
6). close,參數context, func, params:看這個方法實現就知道,apply方法的使用,能夠跟call方法比較一下學習,
http://blog.csdn.net/myhahaxiao/article/details/6952321
7). extend, 繼承的方法。prototype和constructor,原型和構造器,用這兩個來作js裏面的繼承,網上找到不錯文章,推薦你們讀讀,
http://blog.csdn.net/niuyongjie/article/details/4810835
8). alert
9). createUUID,通用惟一識別碼。返回是16進制的,Math.random()隨機生成的。
3. cordova/base64
base64和ArrayBuffer的轉換
define("cordova/base64", function(require, exports, module) { var base64 = exports; //參考ArrayBuffer相關知識,http://javascript.ruanyifeng.com/stdlib/arraybuffer.html //Uint8Array = 8位無符號整數數組,長度1個字節.這個是ArrayBuffer的視圖 base64.fromArrayBuffer = function(arrayBuffer) { var array = new Uint8Array(arrayBuffer); return uint8ToBase64(array); }; //atob = base64 解碼的方法 //btoa = base64 編碼的方法 base64.toArrayBuffer = function(str) { //把str進行解碼 //用window.atob方法 //用Buffer = node.js 中的Buffer,服務器端的js var decodedStr = typeof atob !== 'undefined' ? atob(str) : new Buffer(str, 'base64').toString('binary'); //分配相應大小字節的內存,類型化數組 var arrayBuffer = new ArrayBuffer(decodedStr.length); //建立arrayBuffer的操做視圖 var array = new Uint8Array(arrayBuffer); for (var i = 0, len = decodedStr.length; i < len; i++) { //Uint8Array,是8位的 //charCodeAt, 返回 0-65535, 16位2個字節 array[i] = decodedStr.charCodeAt(i); } return arrayBuffer; }; //------------------------------------------------------------------------------ /* This code is based on the performance tests at http://jsperf.com/b64tests * This 12-bit-at-a-time algorithm was the best performing version on all * platforms tested. */ var b64_6bit = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //一維數組代替二維數組 var b64_12bit; //64X64的表格,橫豎座標軸都是b64_6bit的64個字符 var b64_12bitTable = function() { b64_12bit = []; for (var i = 0; i < 64; i++) { for (var j = 0; j < 64; j++) { b64_12bit[i * 64 + j] = b64_6bit[i] + b64_6bit[j]; } } //不錯的想法 b64_12bitTable = function() { return b64_12bit; }; return b64_12bit; }; // rawData = Uint8Array, 編碼 有點像 ascii to base64 function uint8ToBase64(rawData) { var numBytes = rawData.byteLength; var output = ""; var segment; var table = b64_12bitTable(); for (var i = 0; i < numBytes - 2; i += 3) { segment = (rawData[i] << 16) + (rawData[i + 1] << 8) + rawData[i + 2]; output += table[segment >> 12]; output += table[segment & 0xfff]; } if (numBytes - i == 2) { segment = (rawData[i] << 16) + (rawData[i + 1] << 8); output += table[segment >> 12]; output += b64_6bit[(segment & 0xfff) >> 6]; output += '='; } else if (numBytes - i == 1) { segment = (rawData[i] << 16); output += table[segment >> 12]; output += '=='; } return output; } });
ArrayBuffer相關知識以前沒有接觸過,但base64這個模塊感受不會難理解。
這裏的三個模塊是不依賴其餘模塊的,沒有和native交互的。