// 自己定义一个类数组对像
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定义)
Javascript 类数组类的定义相关知识
最新推荐文章于 2022-04-21 14:26:30 发布