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引擎
  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/QH-Jimmy/p/6436000.html
Copyright © 2011-2022 走看看