Перезапись конструктора Array не влияет на [], верно?

Я только что прочитал это:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

У меня сложилось впечатление, что перезаписьObject или жеArray имел эффект, только если вы решили использовать функции конструктора при созданииarrays/objects, но, согласно этой статье, это также влияет на создание букв ({} а также[])...

Моя логика:

<code>Array = function(){ alert('Hi'); };

[1,2,3,4,5];
([1,2,3,4,5]);
var a = [1,2,3,4,5];

// ...
// ... Nothing is alerted
</code>

Итак, я схожу с ума или есть какие-то специфические особенности реализации, о которых я не знаю?

Ответы на вопрос(3)

Решение Вопроса

Насколько я знаю, это проблема спецификации ECMAScript, которая была исправлена во всех основных браузерах более года назад.Вот это ссылка, которая связывает вас с наиболее релевантными ссылками;)

Но чтобы на самом деле ответить на ваш вопрос, да,Object а такжеArray конструкторы также вызываются для буквальных созданий.fix реализованные браузеры только что сделали эти (и другие) постоянными, чтобы они не могли быть переопределены пользовательскими сценариями.

 James28 июн. 2009 г., 00:02
Отлично! Спасибо за ссылку :)

Проект EcmaScript 5 стандартизирует это исправление, о котором упоминает Джозеф. Он определяет поведение конструктора массива в терминах значения глобального массива в момент создания контекста, как описано в разделе 11.1.4.

Semantics

The production ArrayLiteral : [ Elisionopt ] is evaluated as follows:

Let array be the result of creating a new object as if by the expression new Array() where Array is the standard built-in constructor with that name.

Вместо старого поведения ES 262, которое позволяло заменить конструктор Array:

Semantics

The production ArrayLiteral : [ Elisionopt ] is evaluated as follows:

Create a new array as if by the expression new Array().

Тем не менее, не полагайтесь на[] разумно работать над старшими переводчиками.

Установив Array в качестве функции, вы не переопределяете конструктор массивов, а заменяете функцию.

Чтобы правильно переопределить конструктор, вы должны использовать Array.prototype.defineSetter установить метод, вызываемый в конструкции, и он будет вызываться как для нового Array (), так и при использовании буквенной нотации.

 21 окт. 2009 г., 20:12
Не соответствует действительности в соответствии с разделом 11.4.1 спецификации EcmaScript 262.

Ваш ответ на вопрос