var myarray =
{
add:function(elem)
{
Array.prototype.push.call(this,elem);
}
}
myarray.add(1);
alert(myarray.length);
alert(myarray[0]);以上这段代码是可以直接通过切换Array的push方法的执行环境,直接将myarray变成了一个数组但是,如果以上代码改为var myarray =
{
add:function(elem)
{
Array.push.call(this,elem);
}
}
myarray.add(1);
alert(myarray.length);
alert(myarray[0]);即把prototype给去掉则,myarray无法变成一个数组。请问,这是什么原因呢?
Array.push = Array.prototype.push
var myarray =
{
add:function(elem)
{
Array.push.call(this,elem);
}
}
myarray.add(1);
alert(myarray.length);
alert(myarray[0]);也可以用Array实例化的对象
test:
var myarray =
{
add:function(elem)
{
[].push.call(this,elem);
}
}
myarray.add(1);
alert(myarray.length);
alert(myarray[0]);
Array.prototype.push
Array.push
2个push其实是一个对象,
但是用法不一样
Array.prototype.push是array中定义好的对象也就是方法,这里可以对push进行重写等操作
Array.push是使用当前Array对象的push方法
他们绝对不可能是引用的同一个对象 如果是请你拿出证据ie下Array根本就没有push方法 alert('push' in Array) //ie false ff true
alert(Array.push===Array.prototype.push) //ie ff false
此Array非彼Array
alert('push' in new Array())
alert(new Array().push === Array.prototype.push)
难道你的意思new Array()是Array?????Array类型就值存在这一种类型 不会有别的意思new Array()是实例 也就是数组 感觉你的意思是说 数组是 Array 你的这种解释我真接受不了
还是有是alert('push' in new Array()) 这里的虽然是true 但也不是因为实例化的Array有push方法 它还是返回的Array.prototype.push方法这个叫原型链查找机制test:
var a =new Array();
a.push =1;//这才给a对象赋予一个push方法
alert(a.push);//1
delete a.push
alert(a.push);//原型链上的方法没啥好纠结的 我知道原型 到理解原型和new过程 原型链 花了大把时间