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引擎
  • 相关阅读:
    输出流
    异常处理
    异常限制
    多个受控异常
    跟踪异常传播
    动手动脑练习2
    动手动脑练习
    文件总结
    程序员修炼之道3
    Shell教程 之printf命令
  • 原文地址:https://www.cnblogs.com/QH-Jimmy/p/6436000.html
Copyright © 2011-2022 走看看