请问它两个的区别

yuwenbao 2010-09-19 07:25:44

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无法变成一个数组。请问,这是什么原因呢?
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtcsy 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ibm_hoojo 的回复:]
Array.prototype.push
Array.push
2个push其实是一个对象,
[/Quote]

他们绝对不可能是引用的同一个对象 如果是请你拿出证据

ie下Array根本就没有push方法

alert('push' in Array) //ie false ff true
alert(Array.push===Array.prototype.push) //ie ff false

kaifadi 2010-09-19
  • 打赏
  • 举报
回复
prototype好象一般都是用来构造动态方法的,THIS来组成属性!

但是如果按照楼主那么操作,prototype可能会影响到所有实例的效果!
hoojo 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuwenbao 的回复:]
JScript code

var myarray =
{
add:function(elem)
{
Array.prototype.push.call(this,elem);
}
}

myarray.add(1);
……
[/Quote]

Array.prototype.push
Array.push
2个push其实是一个对象,
但是用法不一样
Array.prototype.push是array中定义好的对象也就是方法,这里可以对push进行重写等操作
Array.push是使用当前Array对象的push方法
wtcsy 2010-09-19
  • 打赏
  • 举报
回复
push是Array原型上面的方法

Array.push是Array上的方法 他们不是同一个

但是你可以吧Array.push指向Array.prototype.push

test:


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]);
  • 打赏
  • 举报
回复
这个看看prototype就知道了
zoujp_xyz 2010-09-19
  • 打赏
  • 举报
回复
要加上原型prototype
wtcsy 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ibm_hoojo 的回复:]
..............................
[/Quote]
此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);//原型链上的方法


[Quote=引用 8 楼 yuwenbao 的回复:]

还是没有明白,现在看来,问题在于Array.push和Array.prototype.push他们之间的区别了?他们有什么区别吗?
[/Quote]
没啥好纠结的 我知道原型 到理解原型和new过程 原型链 花了大把时间

yuwenbao 2010-09-19
  • 打赏
  • 举报
回复
呃。。。最好别说一个是静态方法,一个是实例方法,我想问的是,为什么Array要有这两种功能相同的两个同名方法呢?
yuwenbao 2010-09-19
  • 打赏
  • 举报
回复
还是没有明白,现在看来,问题在于Array.push和Array.prototype.push他们之间的区别了?他们有什么区别吗?
hoojo 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wtcsy 的回复:]

引用 4 楼 ibm_hoojo 的回复:
Array.prototype.push
Array.push
2个push其实是一个对象,


他们绝对不可能是引用的同一个对象 如果是请你拿出证据

ie下Array根本就没有push方法

alert('push' in Array) //ie false ff true
alert(Array.push===A……
[/Quote]

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

87,922

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧