Что такое "внутренний слот" объекта в JavaScript?

Я попытался понять спецификацию ECMAScript 2015 в одном пункте: Внутренние слоты объектов. Но этот раздел мне показался очень неясным, особенно это предложение:

Внутренние слоты соответствуют внутреннему состоянию, связанному с объектами и используемому различными алгоритмами спецификации ECMAScript.

(Использует ли он правильную грамматику?) Может ли кто-нибудь объяснить это понятие на английском языке?


Что я могу понять до сих пор:

  • внутренние слоты не являются свойствами Внутренние слоты
  • используются во время создания объекта, но не добавляются к самому объекту
  • внутренние слоты имеют или имеют значения, изначально undefined

Ответы

Ответ 1

Резюме

Внутренние слоты/методы - это псевдо-свойства/-методы, которые спецификация использует для определения требуемого поведения. ( "Абстрактные операции" являются связанным механизмом спецификации.) Слоты представляют состояние (значения), а методы описывают алгоритмы (поведение). Они могут соответствовать или не соответствовать свойствам объектов, используемых движком, но они недоступны для кода пользователя, за исключением того, что они открыты какой-либо частью публичного API. Фактическая реализация, которую использует движок, может сильно отличаться от того, что излагает внутренние методы, но чтобы быть совместимым, они должны создавать поведение или результаты, соответствующие внутренним методам.

Примеры

[[StringData]] внутренний слот

Поведение String, например. new String("whatever"), описывается в терминах, которые включают внутренний слот [[StringData]], который представляет значение (whatever в этом случае). Внутренний слот напрямую не доступен для кода пользователя, но String.prototype.toString() (например, (new String("whatever")).toString()) определяется в виде абстрактной операции thisStringValue(), которая описана в терминах возврата значения [[StringData]]. Другими словами, String.prototype.toString() является общедоступным API, который по существу является геттером, который предоставляет [[StringData]].

[[OwnPropertyKeys]] внутренний метод

Поведение Object.keys() описано в терминах, включающих вызов внутреннего метода [[OwnPropertyKeys]]. Обратите внимание, что различные объекты, такие как обычные объекты (например, Object) и экзотические объекты (например, String) могут иметь разные определения [[OwnPropertyKeys]]. Когда [[OwnPropertyKeys]] "вызывается" в спецификации, это относится к определению применимого типа. Существуют также некоторые invariant характеристики, которые применяются к его определению для любого типа объекта.

Ответ 2

Это просто уловка, используемая для того, чтобы точно описать, как должны вести себя объекты.

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

Другими словами, это способ написать спецификацию, которая позволяет описывать поведение с императивным кодом, который формально более точен, просто используя многословное "естественное" описание того, каким должно быть поведение.