类数组
1、可以利用属性名模拟数组的特性
2、可以动态的增长length属性
3、如果强行让类数组调用push方法,则会根据length属性的位置进行属性的扩充
什么是类数组
1、属性要为索引(数子)属性;
2、必须有length属性,最好有push方法
3、如果加上splice方法就长得根数组非常像了
形如:
var obj={
'0':'a',
'1':'b',
'2':'c',
'length':3,
'push':Array.prototype.push,
}
console.log(obj)
2、加上splice方法后
var obj2={
'0':'a',
'1':'b',
'2':'c',
'length':3,
'push':Array.prototype.push,
'splice':Array.prototype.splice
}
console.log(obj2)
数组push方法的原理
Array.prototype.push=function (target){
this[this.length]=target;
this.length++;
}
//如果obj调用push方法他的运行是
obj.push('d');
//内部原理
Array.prototype.push=function (target){
//谁调用this就是谁,索引这里this就变成 obj,target则为传入的值为'd',length为3
obj[3]='d';
//则obj.length就为4
obj.length++;
}
//所以例题:
var obj={
'2':'a',
'3':'b',
'length':2,
'push':Array.prototype.push
}
obj.push('c');
obj.push('d');
//问:打印obj是什么样子?好好理解上面的push方法执行
Array.prototype.push=function (target){
this[this.length]=target;
this.length++;
}
//obj.push('c')的时候--->参数target='c'---->this为obj,this.length=2
//所以this[this.length]=target-->obj[2]='c'-->obj.length++为3;
//相当于
Array.prototype.push=function (target){
obj[obj.length]=target;
obj.length++;
}
//所以第一次push('c')的时候obj为:{'2':'c','3':'b','length':3,...}
所以当push('d')的时候和之前一样--->obj[3]='d';obj.length=4