菜鸟学习cordova-android的js源码(2)

  刚刚数了一下,cordova.js中定义了17个模块,下面慢慢来看这17个模块。

  先看比较独立的模块,一些工具模块。

1. cordova/urlutil

模块输出的对象包含一个方法makeAbsolute,把地址转化为绝对地址。

//markdefine("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属性定义存取方法。

实现中有几个方法值得注意一下,Object.defineProperty和__defineGetter__(__defineSetter__),后面那个是非标准的方法。developer.mozilla.org上讲的很详细了,下面是链接

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

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交互的。

时间: 2024-10-13 17:08:55

菜鸟学习cordova-android的js源码(2)的相关文章

菜鸟学习cordova-android的js源码(1)

使用phonegap快两年了,最近才有冲动去看源码,真是太惭愧了,也只能怪自己还是个js菜鸟.所以准备一边学习一边写点东西记录一下. 我现在用的是Cordova3.5版本(现在已经3.6了),js代码大概分为两块:cordova.js对应着cordova的基本框架,android原生代码是单独的一个工程,作为library被引用,也可以导出jar使用:cordova_plugin.js和plugins下的插件模块,对应着工程org.apache.cordova下的java代码,通过这部分可以和a

从Vue.js源码看异步更新DOM策略及nextTick

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/answershuto/learnVue.在学习过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以对其他想学习Vue源码的小伙伴有所帮助.可能会有理解存在偏差的地方,欢迎提issue指出,共同学

从Vue.js源码角度再看数据绑定

## 写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:[https://github.com/answershuto/learnVue](https://github.com/answershuto/learnVue).在学习过程中,为Vue加上了中文的注释[https://github.com/answershuto/learnVue/tree/master/vue-src](http

vue.js源码学习分享(一)

今天看了vue.js源码  发现非常不错,想一边看一遍写博客和大家分享 /** * Convert a value to a string that is actually rendered. *转换一个值为字符串 */ function _toString (val) { return val == null? '': typeof val === 'object'? JSON.stringify(val, null, 2): String(val)//如果该值是null则返回空字符串,如果该

Android(java)学习笔记203:网页源码查看器

1.项目框架图: 2.首先是布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="m

MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法

说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都在它的源码里,只要你踏下心去看,一切就都有了! Knockout.Validation.js是为Knockout插件服务的,它可以为Knockout对象进行验证,就像你使用MVC模型验证 一样,而这种绑定的验证方式对于开发人员来说是很容易接受的,也是一种趋势,它在验证过程中,会将出现异常的点记录下来,然后在

MVVM大比拼之vue.js源码精析

VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多来自knockout.angularjs等大牌框架影响,但作者相信 vue 在性能.易用性方面是有优势.同时也自己做了和其它框架的性能对比,在这里.今天以版本 0.10.4 为准 入口 Vue 的入口也很直白: ? 1 var demo = new Vue({ el: '#demo', data: { message: 'Hello V

underscore.js源码解析

一直想针对一个框架的源码好好的学习一下编程思想和技巧,提高一下自己的水平,但是看过一些框架的源码,都感觉看的莫名其妙,看不太懂,最后找到这个underscore.js由于这个比较简短,一千多行,而且读起来容易一些,所以就决定是它了,那废话不多说开始我们的源码学习. underscore.js源码GitHub地址: https://github.com/jashkenas/underscore/blob/master/underscore.js 本文解析的underscore.js版本是1.8.3

Android SNS 分享 源码地址

最近学习开放平台,官方文档和Demo有点坑爹,经过几天的努力,写了一个DEMO,整合了新浪微博和腾讯微博,均能够SSO授权.网页授权和发微博,如果需要可以去看看源码,里面有注释说明: DEMO源码地址:https://github.com/cstdr/WeiboSDKDemo 说明一下:虽然已经有很多类似的开放平台DEMO,但这个是我根据最新的SDK所完善的,最新的新浪微博SDK是6天前更新的Github,所以我这个还是有一点点价值的啦- 代码使用自己感觉舒服的方式进行封装和整合,使用前需要修改