Давайте оценим следующий литерал объекта:
{[toString]: increment }
toString
- это идентификатор, указывающий на window.toString
(функция). Как указано в ответе, toString
будет вызываться при этом, поскольку ключи объекта всегда являются строками:
{[toString.toString()]: increment }
Теперь это приводит к чему-то вроде:
{["function() { [native code] }"]: increment }
Теперь, если мы вызовем toString()
для этого объекта, стандарт Object.prototype.toString
будет вызван в части {[movingTarget]: 42}
, и в результате получится [Object object]
(как всегда):
let x = 0;
let movingTarget = { ["function() { [native code] }"]: () => ++x };
console.log(
movingTarget.toString(), // [Object object]
{[movingTarget]: 42} // {["[Object object]"]: 42}
);
Вот почему движущаяся цель больше не движется. В исходном коде было установлено toString
объекта, и он вызывается всякий раз, когда movingTarget
превращается в строку:
let x = 0;
let movingTarget = { toString: () => ++x };
console.log(
movingTarget.toString(), // 1
"" + movingTarget, // 2
{[movingTarget]: 42} // { 3: 42 }
);