• 自己的JS框架--Amy框架。


        这是我根据司徒正美《JavaScript框架设计》一书然后百度了很多东西之后自己写的一个JS框架,满足了司徒正美文中的种子模块部分,包含了命名空间、对象扩展、数组化、类型判断、选择器、多库并存,在异步加载中使用了CMD规范的seaJs,这个框架一年前就已经写了,之后一直在研究其他东西,没有进行扩展,今天把它发布出来也是为了时刻提醒自己,以后一定要继续扩展它。

    下面是代码:

    //立即执行的函数表达式
    (function(){
        //定义全局变量_$存储window.$
        var window = this,
            _$ = window.$,
            _Amy = window._Amy,
            DOC = document,
            W3C = DOC.dispatchEvent,      //判断浏览器
            html = DOC.documentElement,  //HTML元素
            head = DOC.head,            //head元素
            rword = /[^,]+/g,          //匹配除 ","以外的东西
            class2type = {
                "[object HTMLDocument]":"Document",
                "[object HTMLCollection]":"NodeList",
                "[object StaticNodeList]":"NodeList",
                "[object DOMWindow]":"Window",
                "[object global]":"Window",
                "null":"Null",
                "NaN":"NaN",
                "undefined":"Undefined"
            },
            toString = class2type.toString();
    
        "Boolean,Number,String,Function,Array,Da,RegExp,Window,Document,Arguments,NodeList"
        .replace(rword,function(name){
            class2type["[object " + name+"]"] = name;
        });
    
        Amy = window.Amy = window.$ = function(selector){
            return new Amy.fn.init(selector);
        };
        
        //选择器初始化querySelector
        Amy.fn = Amy.prototype = {
            init:function(selector){
                var dom = document.querySelector(selector);
                return dom;
            }
        };
    
        Amy.fn.init.prototype = Amy.fn;
        
        //对象扩展(原型方法)
        Amy.extend = Amy.fn.extend = function(obj,prop){
            if(!prop){
                prop = obj;
                obj = this;
            }
            for(var attr in prop){
                obj[attr] = prop[attr];
            }
        };
        
        Amy.extend({
            html : html,
            head :head,
            
            /**
             * 多库并存问题
             */
            noConflict:function(deep){
                window.$ = _$;
                if(deep)
                    window.Amy = _Amy;
                
                return Amy;
            },
            bindThis:function(obj){
                var me = this;
                var arg = [].slice.call(arguments,1);
                return function(){
                    me.apply(obj,arg);
                }
            },
            /**
             * 运行所有参数,返回运行成功的函数返回值
             */
            these:function(){
                var returnVal = null;
                for(var i = 0,len = arguments.length;i<len;i++){
                    var lambda = arguments[i];
                    try{
                        returnVal = lambda();
                    }catch(e){}
                }
                return returnVal;
            },
            /**
             * 根据浏览器获取ajax对象
             */
            ajax:function(){
                return this.these(
                    function() {return new ActiveXObject('Msxml2.XMLHTTP')},
                    function() {return new ActiveXObject('Microsoft.XMLHTTP')},
                    function() {return new XMLHttpRequest()}
                ) || false;
            },
            /**
             *数组化 
             */
            toArray:function(){
                return [].slice.call(arguments);
            },
            /**
             * 数组去重
             */
            noRepeat:function(target){
                var result = {};
                target.forEach(function(item){
                    result[item] = item;
                });
                return Object.keys(result).map(function(item){
                    return item | 0;
                });
            },
            /**
             * 获取多个Id
             * @returns {*}
             */
            list:function(){
                var result = [];
                for(var i = 0,len =arguments.length;i<len;i++){
                    var element = arguments[i];
                    if(typeof element == "string"){
                        element = $(element);
                    }
                    if(len == 1)
                        return element;
                    else
                        result.push(element);
                }
                return result;
            },
            repeat:(function(){
                var join = Array.prototype.join,
                    obj = {};
                return function(target,n){
                    obj.length = n + 1;
                    return join.call(obj,target);
                };
            })(),
            /**
             * 事件绑定
             */
            bind:W3C?function(el,type,fn,bool){
                el.addEventListener(type,fn || $.noop,!!bool);
                return fn;
            } : function(el,type,fn){
                el.attachEvent("on"+type,fn || $.noop);
                return fn;
            },
            /**
             * 解绑事件
             */
            unbind:W3C?function(el,type,fn,bool){
                el.removeEventListener(type,fn,!!bool);
            } : function(el,type,fn){
                el.detachEvent("on"+type,fn);
            },
             /**
             * 用于取得数据的类型(一个参数的情况下)或判定数据的类型(两个参数的情况下)
             * @param {Any} obj 要检测的东西
             * @param {String} str ? 要比较的类型
             * @return {String|Boolean}
             * @api public
             */
            type:function(obj,str){
                var result = class2type[(obj != obj || obj == null)?obj:Object.prototype.toString.call(obj)] || obj.nodeName || "#";
                
                if(result.charAt(0) === "#"){
                    if(obj == obj.document && obj.document != obj){
                        result = "Window";
                    }else if(obj.nodeType === 9){
                        result = 'Document';
                    }else if(obj.callee){
                        result = "Arguments";
                    }else if(isFinite(obj.length) && obj.item){
                        result = "NodeList";
                    }else{
                        result = Object.prototype.toString.call(obj).slice(8,-1);
                    }
                }
                if(str){
                    return str === result;
                }
                return result;
            },
            noop:function(){
                
            },
            //字符串操作
            
            /**
             * 字符串所占字节数
             */
            btyeLen:function(target){
                var byteLength = target.length;
                for(var i = 0,len = target.length;i<len;i++){
                    if(target.charCodeAt(i) > 255)   //若为中文则加1
                        byteLength++;
                }
                return byteLength;
            },
            /**
             *字符串截取,当超过限定时默认添加三个... 
             */
            truncate : function(target,length,text){
                length = length || 30;
                text = text === void 0?"...":text;
                return target.length > length?
                        target.slice(0,length - text.length) + text:String(target);
            },
            capitalize:function(target){
                return target.charAt(0).toUpperCase() + target.slice(1).toLowerCase();
            },
            /**
             * 去除字符串开头和结尾空格
             */
            trim : function(str){
                return str.replace(/^s+|s+$/g,"");
            },
            
            //数组操作
            /**
             * 判断目标中是否包含一个数(数组或字符串)
             */
            contains : function(target,index){
                return target.indexOf(index) > -1;
            },
            /**
             * 删除目标(数组)指定位置的一个数(返回bool)
             */
            removeAt:function(target,index){
                return !!target.splice(index,1).length;
            },
            /**
             *删除目标(数组)中第一次出现的数
             */
            remove:function(target,item){
                var index = target.indexOf(item);
                if(index > -1){
                    return !!target.splice(index,1);
                }
                return false;
            },
            /**
             * 从目标(数组)随机抽取一个数
             */
            random:function(target){
                return target[(Math.random()*target.length)|0];
            },
            /**
             * 数组平坦化操作
             * 命名函数表达式,fla只在函数内有定义,这里用递归
             */
            flatten:function fla(target){  
                var result = [];
                target.forEach(function(item){
                    if(Array.isArray(item)){
                        result = result.concat(fla(item));
                    }else{
                        result.push(item);
                    }
                });
                return result;
            },
            /**
             * 删除数组中null和undefined
             * 利用filter过滤操作  //返回true值
             */
            compact:function(target){
                var result = target.filter(function(item){
                    return item != null;
                });
                return result;
            },
            max:function(target){
                return Math.max.apply(0, target);
            },
            min:function(target){
                return Math.min.apply(0,target);
            },
            //数值扩展
            /**
             * 确保数值在[n1,n2]之间
             */
            limit:function(target,n1,n2){
                var arr = [n1,n2].sort();
                if(target < arr[0]){
                    target = arr[0];
                }
                if(target > arr[1]){
                    target = arr[1];
                }
                return target;
            },
            iterator:function iter(n,type){
                if(typeof type == "undefined" || type == "*"){
                    return n==0 ? 1:n*iter(n-1);
                }else if(type == "+"){
                    return n==0 ? 1:n+iter(n-1);
                }
            },
            /**
             * 求距离目标最近的数
             */
            near : function(target,n1,n2){
                var diff1 = Math.abs(target - n1),
                    diff2 = Math.abs(target - n2);
                return diff1 < diff2?n1:n2;
            },
            /**
             * 复制数组
             * 一般不希望别人访问原数组进行修改
             */
            clone:function(target){
                if(this.type(target) == "Array"){
                    var arr = new Array(target.length);
                    for(var i = 0,len = target.length;i<len;i++){
                        arr[i] = target[i];
                    }
                    return arr;
                }else{
                    return 0;
                }
            }
                
        });
    })();
    View Code
  • 相关阅读:
    简单了解enum
    PowerDesigner CDM 生成PDM时,外键的命名规则
    HADOOP docker(五):hadoop用户代理 Proxy user
    记一次云安全的安全事件应急响应
    docker学习笔记--重基础使用
    Elasticsearch学习随笔(二)-- Index 和 Doc 查询新建API总结
    Elasticsearch学习随笔(一)--原理理解与5.0核心插件部署过程
    ntopng-一款流量审计框架的安装以及应用
    Suricata规则编写——常用关键字
    浅谈运维中的安全问题-FTP篇
  • 原文地址:https://www.cnblogs.com/xiaohaoxuezhang/p/4811203.html
Copyright © 2020-2023  润新知