菜鳥學習cordova-android的js源碼(2)

  剛剛數了一下,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交互的。

相關文章
相關標籤/搜索