This page was translated from English by the community.Learn more and join the MDN Web Docs community.
Property accessors
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since июль 2015 г..
Доступ к свойствам объекта можно получить, используя точечную и скобочную записи.
In this article
Интерактивный пример
const person1 = {};person1["firstname"] = "Mario";person1["lastname"] = "Rossi";console.log(person1.firstname);// Expected output: "Mario"const person2 = { firstname: "John", lastname: "Doe",};console.log(person2["lastname"]);// Expected output: "Doe"Синтаксис
object.propertyobject["property"]
Описание
Можно думать об объекте как об ассоциативном массиве (иликарте, словаре, хэш-таблице, таблице поиска).Ключи в таком массиве - это имена свойств объекта.
Когда речь идёт о свойствах объекта, обычно различают собственно свойства и методы. Однако разделение свойство/метод это не более чем условность. Метод - это просто свойство, которое можно вызвать (например, если оно содержит ссылку нафункцию в качестве значения.
Есть два способа доступа к свойствам: точечная и скобочная записи.
Точечная запись
В записиobject.property, property должно быть действительнымидентификатором. (В стандарте ECMAScript, имена свойств технически называются "IdentifierNames", а не "Identifiers", поэтому зарезервированные слова могут быть использованы в их качестве, но это не рекомендуется). Например,object.$1 является верной записью, аobject.1 - нет.
const variable = object.property_name;object.property_name = value;const object = {};object.$1 = 'foo';console.log(object.$1); // 'foo'object.1 = 'bar'; // SyntaxErrorconsole.log(object.1); // SyntaxErrorЗдесь метод с именемcreateElement считывается с объектаdocument и вызывается.
document.createElement("pre");Если вы хотите вызвать метод на численном литерале, не имеющий части с экспонентой или точки, отделяющей дробную часть, нужно ставить пробел перед точкой, являющейся частью обращения к этому методу, чтобы интерпретатор не посчитал, что это точка отделяет дробную часть числа (или использовать другие способы этого избежать).
// SyntaxError, здесь считается, что 77. это число,// поэтому такая запись эквивалентна (77.)toExponentional()// что является ошибкой77.toExponentional()// Рабочие варианты:77.toExponential()77.toExponential();(77).toExponential()// Здесь первая точка относится к числу, вторая вызывает метод// то есть эта запись равносильна (77.).toExponential()77..toExponential()// Эквивалентно (77.0).toExponential()77.0.toExponential()Скобочная запись
В записиobject[property_name],property_name - это выражение, вычисляющееся в строку илисимвол. Это может быть любая строка, не обязательно действительный идентификатор, например'1foo', '!bar!' или даже' ' (пробел).
const variable = object[property_name];object[property_name] = value;Пример, аналогичный примеру в предыдущем пункте:
document["createElement"]("pre");Пробел перед скобкой допускается:
document["createElement"]("pre");Имена свойств
Имена свойств могут быть строками илисимволами. Любое другое значение приводится к строке. Следующий код выводит'value', поскольку число1 приводится к строке'1'.
const object = {};object["1"] = "value";console.log(object[1]);Этот пример также выводит'value', так как иfoo, и bar приводятся к одной и той же строке.
const foo = { unique_prop: 1 };const bar = { unique_prop: 2 };const object = {};object[foo] = "value";console.log(object[bar]);В движкеSpiderMonkey JavaScript это строка'[object Object]'.
Привязка методов
Метод не привязан к содержащему его объекту. Это значит, что значениеthis в методах объекта не всегда указывает на него. Вместо этого,this "передаётся" при вызове метода. Смотрите подробнееthis.
Примеры
>Скобочная запись илиeval
Новички JavaScript часто делают ошибку, используяeval там, где можно просто использовать скобочную запись.
Например, следующий синтаксис можно часто увидеть в скриптах.
x = eval("document.forms.form_name.elements." + strFormControl + ".value");Функцияeval() очень медленная и её использования следует избегать, когда это возможно. Кроме того, строкаstrFormControl при таком использовании обязаны содержать действительный идентификатор, что не является обязательным дляid полей формы, то есть, например, поле с id 1 не получится получить такой записью. Лучше вместо этого использовать скобочную запись:
x = document.forms["form_name"].elements[strFormControl].value;Спецификации
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-property-accessors> |