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无法变成一个数组。请问,这是什么原因呢?

解决方案 »

  1.   

    push是Array原型上面的方法Array.push是Array上的方法  他们不是同一个但是你可以吧Array.push指向Array.prototype.pushtest:
    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]);
      

  2.   


    Array.prototype.push
    Array.push
    2个push其实是一个对象,
    但是用法不一样
    Array.prototype.push是array中定义好的对象也就是方法,这里可以对push进行重写等操作
    Array.push是使用当前Array对象的push方法
      

  3.   

    prototype好象一般都是用来构造动态方法的,THIS来组成属性!但是如果按照楼主那么操作,prototype可能会影响到所有实例的效果!
      

  4.   


    他们绝对不可能是引用的同一个对象  如果是请你拿出证据ie下Array根本就没有push方法  alert('push' in Array)   //ie false  ff true
    alert(Array.push===Array.prototype.push)   //ie ff  false
      

  5.   


    此Array非彼Array
    alert('push' in new Array()) 
    alert(new Array().push === Array.prototype.push)
      

  6.   

    还是没有明白,现在看来,问题在于Array.push和Array.prototype.push他们之间的区别了?他们有什么区别吗?
      

  7.   

    呃最好别说一个是静态方法,一个是实例方法,我想问的是,为什么Array要有这两种功能相同的两个同名方法呢?
      

  8.   

    此Array非彼Array??
    难道你的意思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过程  原型链  花了大把时间