Ответ 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 характеристики, которые применяются к его определению для любого типа объекта.