zoukankan      html  css  js  c++  java
  • [转帖]Mootools源码分析02 Utils

    //检查对象是否已经定义或者已经赋值
    function $chk(obj) {
    return!!(obj || ōbj ===0);
    };

    //通用清除计时器的方法,即能清setTimeout,又能清setInterval,即使计时器不存在也不会报错
    function $clear(timer) {
    clearTimeout(timer);
    clearInterval(timer);
    returnnull;
    };

    /*
    检查对象属性是否已初始化/定义,注意只能检查对象的属性,不能直接检查变量
    因为未定义变量在调用本方法前便会抛出错误,切记
    */
    function $defined(obj) {
    return (obj != undefined);
    };

    //一个空的函数,主要用于事件的初始化
    function $empty() {};

    //闭包应用,延后取指定的参数值
    function $arguments(i) {
    returnfunction() {
    return arguments[i];
    };
    };

    //lambda(匿名)函数,将指定变量函数化,保证返回一个function对象,类似$splat,将变量数组化
    function $lambda(value) {
    return (typeof value =='function') ? value : function() {
    return value;
    };
    };

    //浅拷贝扩展,不考虑object型属性的,只是简单的覆盖
    function $extend(original, extended) {
    for (var key in (extended || {})) original[key] = extended[key];
    return original;
    };

    //解链对象,主要是解决object类型的变量赋值时会影响原值的问题,所以修改其实我觉得叫clone的话更明了
    function $unlink(object) {
    var unlinked =null;

    switch ($type(object)) {
    case'object':
    unlinked
    = {};

    //深拷贝
    for (var p in object) unlinked[p] = $unlink(object[p]);
    break;
    case'hash':

    //深拷贝
    unlinked = $unlink(object.getClean());
    break;
    case'array':
    unlinked
    = [];

    //深拷贝
    for (var i =0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
    break;
    default:
    return object;
    }

    return unlinked;
    };

    //合并所有对象,参数位置越后优先级越高,就是说后面的参数对象属性会覆盖前面的,注意用到了$unlink
    function $merge() {
    var mix = {};
    for (var i =0, l = arguments.length; i < l; i++) {
    var ōbject = arguments[i];
    if ($type(object) !='object') continue;
    for (var key in object) {
    var ōp = object[key], mp = mix[key];
    mix[key]
    = (mp && $type(op) =='object'&& $type(mp) =='object') ? $merge(mp, op) : $unlink(op);
    }
    }
    return mix;
    };

    //返回参数列表中从左到右第一个已定义的表达式的值
    function $pick() {
    for (var i =0, l = arguments.length; i < l; i++) {
    if ($defined(arguments[i])) return arguments[i];
    }
    returnnull;
    };

    //在min到max之间取一个随机数
    function $random(min, max) {
    return Math.floor(Math.random() * (max - min +1) + min);
    };

    //变量数组化,通常用于保证之后的代码能执行数组的each方法
    function $splat(obj) {
    var type = $type(obj);
    return (type) ? ((type !='array'&& type !='arguments') ? [obj] : obj) : [];
    };

    //当前的时间截,Fx中的时间周期判断使用较多
    var $time = Date.now ||function() {
    returnnew Date().getTime();
    };

    //依次尝试执行参数列表中的函数,与Prototype的Try.these异工同曲之妙,只是更简练
    function $try() {
    for (var i =0, l = arguments.length; i < l; i++) {
    try {
    return arguments[i]();
    }
    catch(e) {}
    }
    returnnull;
    };

    //判断对象类型,JS中很多类型typeof都是object,无法精确判断,但是因为有Native的实现,使精确判断类型成为了可能
    function $type(obj) {
    if (obj == undefined) returnfalse;

    //此行代码的实现有赖于Native的创意
    if (obj.$family)
    return (obj.$family.name =='number'&&!isFinite(obj)) ?false : obj.$family.name;
    if (obj.nodeName) {
    switch (obj.nodeType) {
    case1: return'element';
    case3: return (/\S/).test(obj.nodeValue) ?'textnode' : 'whitespace';
    }
    }
    elseif (typeof obj.length =='number') {
    if (obj.callee) return'arguments';
    elseif (obj.item) return'collection';
    }
    returntypeof obj;
    };
  • 相关阅读:
    蓝桥杯程序设计 剪格子
    sql中 1<> 1=1的用处
    form表单的6种提交方式
    js中添加监听,判断是什么事件
    angular iFrame加载资源问题
    报表往子报表里传入list
    struts 文件上传
    获取运行时的泛型类型
    Dao层抽取BaseDao
    SSH整合总结
  • 原文地址:https://www.cnblogs.com/pigtail/p/2156041.html
Copyright © 2011-2022 走看看