zoukankan      html  css  js  c++  java
  • JS框架设计读书笔记之-核心模块

    随笔记录一下读书心得

    1. 框架模块-核心模块

      该模块是框架最先执行的部分,jQuery与vue中都有初始化的代码。

      模块的功能主要是:对象扩展、数组化、类型判定、事件绑定和解绑、无冲突处理、模块加载、domReady

      之前阅读过jQuey的部分源码,对这些功能还是有感触的,比如说:

      对象扩展:

    jQuery.extend({
        merge: function(first, second) {
            var len = +second.length,
                j = 0,
                i = first.length;
    
            for (; j < len; j++) {
                first[i++] = second[j];
            }
    
            first.length = i;
    
            return first;
        },
        grep: function(elems, callback, invert) {
            var callbackInverse,
                matches = [],
                i = 0,
                length = elems.length,
                callbackExpect = !invert;
            for (; i < length; i++) {
                callbackInverse = !callback(elems[i], i);
                if (callbackInverse !== callbackExpect) {
                    matches.push(elems[i]);
                }
            }
    
            return matches;
        },
        map: function(elems, callback, arg) {
            var length, value,
                i = 0,
                ret = [];
            if (isArrayLike(elems)) {
                length = elems.length;
                for (; i < length; i++) {
                    value = callback(elems[i], i, arg);
    
                    if (value != null) {
                        ret.push(value);
                    }
                }
            } else {
                for (i in elems) {
                    value = callback(elems[i], i, arg);
    
                    if (value != null) {
                        ret.push(value);
                    }
                }
            }
            return concat.apply([], ret);
        },
        guid: 1,
        proxy: function(fn, context) {
            var tmp, args, proxy;
    
            if (typeof context === "string") {
                tmp = fn[context];
                context = fn;
                fn = tmp;
            }
            if (!jQuery.isFunction(fn)) {
                return undefined;
            }
            args = slice.call(arguments, 2);
            proxy = function() {
                return fn.apply(context || this, args.concat(slice.call(arguments)));
            };
            proxy.guid = fn.guid = fn.guid || jQuery.guid++;
    
            return proxy;
        }
    })

      数组化:

    jQuery.fn = jQuery.prototype = {
            toArray: function() {
                return slice.call(this);
            },
            makeArray: function(arr, results) {    
                var ret = results || [];
    
                if (arr != null) {
                    if (isArrayLike(Object(arr))) {
                        jQuery.merge(ret,
                            typeof arr === "string" ? [arr] : arr
                        );
                    } else {
                        push.call(ret, arr);
                    }
                }
                return ret;
            }
        }

      类型判断:isFunction、type、isArrayLike

    jQuery.extend({
        noop: function() {},
        isFunction: function(obj) {
            return jQuery.type(obj) === "function";
        },
        isArray: Array.isArray,
        isWindow: function(obj) {
            return obj != null && obj === obj.window;
        },
    
        isNumeric: function(obj) {
            var type = jQuery.type(obj);
            return (type === "number" || type === "string") &&
                // subtraction forces infinities to NaN
                !isNaN(obj - parseFloat(obj));
        },
    
        isPlainObject: function(obj) {
            var proto, Ctor;
            if (!obj || toString.call(obj) !== "[object Object]") {
                return false;
            }
            proto = getProto(obj);
            if (!proto) {
                return true;
            }
            Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
            return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
        },
    
        isEmptyObject: function(obj) {
            var name;
            for (name in obj) {
                return false;
            }
            return true;
        }
    })

      事件绑定和解绑:on?

      无冲突处理:noConflict

    // $可能为其他框架的符号
    var _jQuery = window.jQuery, _$ = window.$;
    jQuery.exteng({
      noConflict: function(deep){
        // 如果冲突 就把jQuery还回去
        window.$ = _$;
        if(deep){
          window.jQuery = _jQuery;
        }
        return jQuery;
      }
    })

      模块加载:初始化?

      domReady:利用DOMContentLoaded   这个接口属于Event 用法如下(来自MDN):

    document.addEventListener("DOMContentLoaded",callback)

      第一节先这么写着,后面写一些比较有意思的函数

    老子要日穿V8引擎
  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/QH-Jimmy/p/6436000.html
Copyright © 2011-2022 走看看