Однажды у меня также был занят сценарий, который был занят часами, не показывая никакого прогресса. Поэтому я реализовал функцию, которая в основном включает в себя приемы предыдущих ответов:
#!/bin/bash
# Updates the progress bar
# Parameters: 1. Percentage value
update_progress_bar()
{
if [ $# -eq 1 ];
then
if [[ $1 == [0-9]* ]];
then
if [ $1 -ge 0 ];
then
if [ $1 -le 100 ];
then
local val=$1
local max=100
echo -n "["
for j in $(seq $max);
do
if [ $j -lt $val ];
then
echo -n "="
else
if [ $j -eq $max ];
then
echo -n "]"
else
echo -n "."
fi
fi
done
echo -ne " "$val"%\r"
if [ $val -eq $max ];
then
echo ""
fi
fi
fi
fi
fi
}
update_progress_bar 0
# Further (time intensive) actions and progress bar updates
update_progress_bar 100
Насколько мне известно, это проблема спецификации ECMAScript, которая была исправлена во всех основных браузерах более года назад. Здесь ссылка, которая связывает вас с наиболее релевантными ссылками;)
Но чтобы ответить на ваш вопрос, да, конструкторы Object
и Array
являются также используется для буквальных творений. Реализованные браузеры fix просто сделали эти (и другие) константами, поэтому они не могут быть переопределены пользовательскими скриптами.
Установив Array как функцию, вы не переопределяете конструктор массивов, а вместо этого заменяете функцию.
Чтобы правильно переопределить конструктор, вы должны использовать Array.prototype. defineSetter для установки метода, вызываемого при построении, и это будет вызываться как в new Array (), так и при использовании буквальной нотации.
The EcmaScript 5 draft standardizes this fix Josef mentions. It specifies the behavior of the array constructor in terms of the value of the Array global at the time the context was created as described in section 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 ()
гдеArray
- стандартный встроенный конструктор с таким именем.
Вместо старого поведения ES 262, которое позволяло заменить конструктор массива:
Семантика
Производственный
ArrayLiteral: [Elisionopt]
оценивается следующим образом:
- Создать новый массив как будто выражением
new Array ()
.
Тем не менее, не полагайтесь на []
разумную работу с более старыми интерпретаторами.