代码之家  ›  专栏  ›  技术社区  ›  James

覆盖数组构造函数不会影响[],对吗?

  •  12
  • James  · 技术社区  · 15 年前

    我刚刚读到: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

    我的印象是 Object Array 只有在创建时选择使用构造函数函数时才有效 arrays / objects 但是,根据那篇文章,它对文字创造也有影响。( {} [] )

    我的逻辑:

    Array = function(){ alert('Hi'); };
    
    [1,2,3,4,5];
    ([1,2,3,4,5]);
    var a = [1,2,3,4,5];
    
    // ...
    // ... Nothing is alerted
    

    那么,我是疯了还是有一些我不知道的特定于实现的怪癖?

    3 回复  |  直到 15 年前
        1
  •  14
  •   Josef Pfleger    15 年前

    据我所知,这是ECMAScript规范的一个问题,一年多前在所有主要浏览器中都已修复。 Here 是将您链接到最相关链接的链接;)

    但要真正回答你的问题,是的, Object Array 构造器也被用于文本创建。这个 修理 实现的浏览器只是使这些(和其他)保持不变,这样自定义脚本就不会覆盖它们。

        2
  •  5
  •   Mike Samuel    15 年前

    ECMAScript 5草案标准化了Josef提到的这个修正。它按照第11.1.4节中描述的创建上下文时数组全局值来指定数组构造函数的行为。

    语义

    生产 ArrayLiteral : [ Elisionopt ] 评估如下:

    1. 将数组作为表达式创建新对象的结果 new Array() 哪里 Array 是具有该名称的标准内置构造函数。

    而不是允许替换数组构造函数的旧ES 262行为:

    语义

    生产 ArrayLiteral : [ Elisionopt ] 评估如下:

    1. 按表达式创建新数组 新数组() .

    也就是说,不要依赖 [] 对老一点的口译员有敏锐的判断力。

        3
  •  0
  •   Sean Kinsey    15 年前

    通过将数组设置为函数,您不会重写数组的构造函数,而是替换函数。

    要正确地重写构造函数,您将使用array.prototype。 定义器 要设置在构造时调用的方法,在新数组()和使用文字表示法时都将调用此方法。