我刚读过这篇文章: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
我的印象是,如果您在创建<时选择使用构造函数,则覆盖 Object
或 Array
只会产生影响strong> arrays
/ objects
,但根据该文章,它也会对文字创建产生影响( {}
< / strong>和 []
)...
我的逻辑:
Array = function(){ alert('Hi'); };
[1,2,3,4,5];
([1,2,3,4,5]);
var a = [1,2,3,4,5];
// ...
// ... Nothing is alerted
那么,我是否会发疯或者是否存在一些我不知道的特定于实现的怪癖?
答案 0 :(得分:14)
据我所知,这是ECMAScript规范的一个问题,并在一年前的所有主流浏览器中得到修复。 Here是一个链接,可将您链接到最相关的链接;)
但是要真正回答你的问题,是的,Object
和Array
构造函数也会被用于文字创作。实现的修复浏览器只是使这些(和其他)不变,因此它们不能被自定义脚本覆盖。
答案 1 :(得分:5)
EcmaScript 5草案标准化了约瑟夫提到的这个修正案。它根据11.1.4节中描述的创建上下文时Array Array的值来指定数组构造函数的行为。
语义
生产
ArrayLiteral : [ Elisionopt ]
的评估如下:
- 让数组成为创建新对象的结果,就像通过表达式一样
醇>new Array()
其中Array
是具有该名称的标准内置构造函数。
而不是允许替换Array构造函数的旧ES 262行为:
语义
生产
ArrayLiteral : [ Elisionopt ]
的评估如下:
- 创建一个新数组,就像使用表达式
一样 醇>new Array()
。
尽管如此,不要依赖[]
合理地对老口译员工作。
答案 2 :(得分:0)
通过将Array设置为函数,您不会覆盖数组的构造函数,而是替换函数。
要正确覆盖构造函数,可以使用Array.prototype。 defineSetter 来设置构造时调用的方法,这将在new Array()和使用文字表示法时调用。