Сообщение от psihoz26
|
пару примеров с alert(1)
1.
toString.constructor.prototype.toString=toString.call;["","alert(1)"].sort(toString.constructor)
|
изящный прикол.
объяснить несложно, но придумать такое я бы не смог
сначала для наглядности заменим toString.constructor на Function (это он и есть), и для большей наглядности toString.call на Function.prototype.call, чтобы не забыть откуда что берется:
Function.prototype.toString = Function.prototype.call;
["", "alert(1)"].sort(Function);
далее, при сортировке, поскольку элементов всего 2, callback сравнения будет вызван только один раз, и это будет вызов Function("", "alert(1)"), который в результате вернет функцию, делающую алерт(1).
Но результат этого callback'а надо сравнить с 0, для чего у него (результата Function("", "alert(1)")) вызывается метод valueOf(), который для функции просто использует toString().
И вот тут вспоминаем, что у функций теперь вместо toString реально используется call. Фактически мы делаем Function("", "alert(1)").call(), т.е. просто вызываем созданную функцию.