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)

 

 

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

 

posted @ 2017-02-23 23:02  书生小龙  阅读(587)  评论(0编辑  收藏  举报