原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-400118

原作者:我佛山人

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

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

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

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

//闭包应用,延后取指定的参数值
function $arguments(i)    {
    return function()    {
        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];
    }
    return null;
};

//在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()    {
    return new Date().getTime();
};

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

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

//此行代码的实现有赖于Native的创意
    if (obj.$family)
        return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name;
    if (obj.nodeName)    {
        switch (obj.nodeType)    {
        case 1: return 'element';
        case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
        }
    } else if (typeof obj.length == 'number')    {
        if (obj.callee) return 'arguments';
        else if (obj.item) return 'collection';
    }
    return typeof obj;
};

转载于:https://www.cnblogs.com/maapaa/articles/mootools-s-2.html

[转帖]Mootools源码分析-02 -- Utils相关推荐

  1. [转帖]Mootools源码分析-49 -- Asset

    原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-410355 原作者:我佛山人 代码 //脚本,样式和图片的 ...

  2. [转帖]Mootools源码分析-04 -- Array

    //对数组的扩展实现Array.implement({ //迭代方法,call的使用 forEach: function(fn, bind) {for (var i =0, l =this.lengt ...

  3. [转帖]Mootools源码分析-03 -- Hash

    //哈希表,Native化作为内置对象var Hash =new Native({ //族名,类名,用于$type方法的精准类型判断 name: 'Hash', initialize: functio ...

  4. 【Busybox】Busybox源码分析-02 | init程序

    linux内核启动过程的后期,在kernel_init()函数代表的init线程中,会尝试执行用户空间的init进程: 从上述代码可见,会尝试执行/sbin/./etc./bin三个目录中的init. ...

  5. 【基础】【后台】 微信小程序 - 腾讯云 - wafer2 - PHP - DEMO - 003 - 源码分析 - 02 - 路由

    本文原创,欢迎转载,但是,务必保持原文并且给出原文链接. 前言: 前一篇已经介绍了,整个wafer2的文件组织,这里结合文件组织,分析一下,微信后台采用的MVC的框架. 路由是服务器配置管理的重要方面 ...

  6. Libev源码分析02:Libev中的IO监视器

    一:代码流程 在Libev中,启动一个IO监视器,等待该监视器上的事件触发,然后调用该监视器的回调函数.整个的流程是这样的: 首先调用ev_default_loop初始化struct  ev_loop ...

  7. jQuery源码分析-02正则表达式-RegExp-常用正则表达式

    转载自:http://nuysoft.iteye.com/blog/1217898 常用的数字正则(严格匹配)正则 含义 ^[1-9]\d*$ 匹配正整数 ^-[1-9]\d*$ 匹配负整数 ^-?[ ...

  8. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  9. bytearrayinputstream java_java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)...

    我们以ByteArrayInputStream,拉开对字节类型的"输入流"的学习序幕. 本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码, ...

最新文章

  1. 【ASP.NET 问题】Win7中IIS被防火墙阻止导致外网无法访问的解决方法。
  2. 马化腾:用户体验的10/100/1000法则
  3. java第六章工具包6.2.Collection Streams 2020.4.7
  4. 编写你的第一个 Django 应用,第 6 部分
  5. 在Spring Boot中使用切面统一处理自定义的异常
  6. 首先记录异常的根本原因
  7. JAVA实现在面板中添加图表_Java 创建PowerPoint图表并为其添加趋势线
  8. FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
  9. brew 安装php56,homebrew安装php5.6后的信息
  10. 我发现了个 Python 黑魔法,执行任意代码都会自动念上一段「平安经」
  11. mysql systemctl开机启动_Linux 开机启动项命令:chkconfig 和 systemctl
  12. 三菱plc pwm指令_学会了这27条基本逻辑指令,你离熟练编程三菱PLC又近了一步!...
  13. Hexo 博客提交百度、谷歌搜索引擎收录
  14. 线性代数-n维向量知识点总结
  15. 今天吃什么随机网页_灵魂拷问:今天在西昌你想吃什么?
  16. 为什么计算机是32位64位,64位是x86还是x64_为什么64位是X64,32位是X86?
  17. 山东省第五届ACM大学生程序设计竞赛 Weighted Median
  18. python:使用unquote对url解码
  19. 操作系统 第6次作业
  20. 搭建开发环境 | 工欲善其事,必先利其器(C、C++、Java、Python)

热门文章

  1. 模切ERP和免费OA系统是互相结合提高效率
  2. Jenkins常用插件
  3. 第九周项目6-穷举法之年龄几何
  4. [WorldWind学习]5.相机对象
  5. 陶哲轩实分析 定理 13.1.5
  6. C++中关于cons和字符串t的一些注意事项
  7. IBM DS300 安装
  8. 华为3COM交换机PVLAN配置使用说明
  9. Minor GC和Full GC
  10. teechart绘制实时曲线_快速学会CAD绘制传输线路图纸