Javascript 类数组类的定义相关知识

来源:互联网 发布:mac怎么调整图片方向 编辑:程序博客网 时间:2024/06/06 17:34
   // 自己定义一个类数组对像    var arrayExtensible = (function(){          //用于检测类对像中是否可以设置length属性            function TMP(){            };            TMP.prototype = [];            var t = new TMP();            TMP.prototype = null;        t.length = 1;  //IE 6, IE7是不能给数组对像设置length属性,同时返回0        return t.length === 1;    })()    var toString = {}.toString;    function isArray(it){        return toString.call(it) == '[object Array]';    }    function mixin(dest, source){        //在这里没有考虑对IE6,7 bug, toString, valueOf不会出现在 for/in中, 即使在source中重新定义,        for(var name in source){            dest[name] = source[name];        }    }    function ArrayLike(array){        var isNew = this instanceof ArrayLike && arrayExtensible;        if(typeof array === "array"){            array = new Array(array);        }        var nodeArray = isArray(array) ? array : arguments;        if(isNew || !nodeArray.sort){            var target = isNew ? this : [], //如果不是new 创建对像,target赋值为[];            l = target.length = nodeArray.length; // 必须设置 target.length, 如则这个对像不会有length;属性            for(var i = 0; i < l; i++){                target[i] = nodeArray[i];            }            if(isNew)                return target;            nodeArray = target;  //将arguments 转换为 真实的数组 target;        }        mixin(nodeArray, alp);        return nodeArray;    }    var alp = ArrayLike.prototype = arrayExtensible ? [] :{}    alp._wrap = function(){        consoele.log('aa')    }    alp.toString = function(){        return this.join(','); //必须定义toString 方法,因为Array.prototype.toString不能应该到对像上     }    //example   var ab = new ArrayLike('aaa', 'bbbb');    ab.push(1)   console.log(ab instanceof ArrayLike)    var ab1 = ArrayLike(['a','b']);    console.log(ab1 instanceof ArrayLike) // false, 它是一个真实的数组,只是有ArrayLike的方法    var a = ab.slice(0,2);        console.log(a)    // 还应该定义forEach方法, slice, splice方法(不应该返回数组, 而应该返回一个ArrayLike对像, 可以查看dojo/query.js的NodeList定义)

0 0
原创粉丝点击