js重写数组构造函数的问题

liaowells 2011-07-03 06:41:34
<script>
function Array()
{
alert("hi");
}
var a = [10];
</script>

上面代码在IE和FF下都不会弹出框,为什么?
...全文
310 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnnzp 2011-07-05
  • 打赏
  • 举报
回复
非常老的FF的js引擎对一些native的对象(如String,Array等)的constructor是有保护的,也就是js脚本是不允许修改的,所以重定义Array,String没有效果。
但是最新的js引擎都没有这些限制了。
cnnzp 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liaowells 的回复:]

引用 2 楼 tcwsyt 的回复:
JScript code


function Array()
{
alert("hi");
}
var a = new Array(10);


但是我之前看过帖子说,当JS检测到数组类型时,会自动调用数组的构造函数Array(),难道这个说法是错的?
[/Quote]

这个说法没有错。

针对new Array(10)这条语句,在js执行引擎中实际上是这样执行的:

var a = new Object();
a.__proto__ = Array.prototype;
Array.apply(a, 10);

首先都是创建一个简单的对象。将其继承链指向new对象的prototype,在调用Array这个function。

本来Array是一个native的function,但是现在被你覆盖成你自定义的函数了。

具体我的FF和IE都可以弹出对话框。

非常老的FF的js引擎对一些native的对象(如String,Array等)的constructor是有保护的,也就是js脚本是允许修改的,所以重定义Array,String没有效果。
但是最新的js引擎都没有这些限制了。
liaowells 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tcwsyt 的回复:]
JScript code


function Array()
{
alert("hi");
}
var a = new Array(10);
[/Quote]

但是我之前看过帖子说,当JS检测到数组类型时,会自动调用数组的构造函数Array(),难道这个说法是错的?
挨踢直男 2011-07-04
  • 打赏
  • 举报
回复
就好比
function String()
{
alert("x")
}
var x = "xxxx"



js又没说他们一定是一样的
灬上海爽爷 2011-07-04
  • 打赏
  • 举报
回复

function Array()
{
alert("hi");
}
var a = new Array(10);

koo42636880 2011-07-04
  • 打赏
  • 举报
回复
Array()怎么能弹出框呢?

又没调用!
KK3K2005 2011-07-04
  • 打赏
  • 举报
回复
[] 和 Array
大家都在调用底层的东西
chen1027448325 2011-07-04
  • 打赏
  • 举报
回复
可能吗
豆虫 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liaowells 的回复:]
引用 2 楼 tcwsyt 的回复:
JScript code


function Array()
{
alert("hi");
}
var a = new Array(10);


但是我之前看过帖子说,当JS检测到数组类型时,会自动调用数组的构造函数Array(),难道这个说法是错的?
[/Quote]
此时的Array覆盖了js数组类型Array 再不确定的话 alert(a.length)

87,990

社区成员

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

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