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

   // 自己定义一个类数组对像
    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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值