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

Однажды у меня также был занят сценарий, который был занят часами, не показывая никакого прогресса. Поэтому я реализовал функцию, которая в основном включает в себя приемы предыдущих ответов:

#!/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
13
задан Josef Pfleger 27 June 2009 в 22:06
поделиться

3 ответа

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

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

14
ответ дан 1 December 2019 в 23:15
поделиться

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

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

0
ответ дан 1 December 2019 в 23:15
поделиться

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:

  1. Let array be the result of creating a new object as if by the expression new Array () где Array - стандартный встроенный конструктор с таким именем.

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

Семантика

Производственный ArrayLiteral: [Elisionopt] оценивается следующим образом:

  1. Создать новый массив как будто выражением new Array () .

Тем не менее, не полагайтесь на [] разумную работу с более старыми интерпретаторами.

5
ответ дан 1 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: