Доступ к свойствам объекта представляют точечная и скобочная нотации.
Синтаксис
object.property object["property"]
Описание
Можно подумать, что объект - ассоциативный массив (a.k.a. map, dictionary, hash, lookup table). Ключи в этом массиве - имена свойств объекта. Обычно, когда речь идет о свойствах объекта, различают свойства и методы. Тем не менее, различие свойства/метода это не более чем условность. Метод - просто свойство, которое можно, например, вызвать, если он имеет ссылку на экземпляр функции в качестве значения.
Есть два способа доступа к свойствам: точечная и скобочная нотации.
Точечная нотация
get = object.property; object.property = set;
В этом коде, property
должно быть валидным JS индетификатором, т.е. последовательности букв и цифр, а также включающая нижнее подчеркивание ("_
") и знак доллара ("$
"), но не может начинаться с цифры. К примеру object.$1
валидно, в то время как object.1
нет.
document.createElement('pre');
Здесь метод "createElement" возвращается из document
и вызывается.
Скобочная нотация
get = object[property_name]; object[property_name] = set;
property_name
- строка. Строка не обязательно может быть правильным индентификатором; может иметь любое значение, например "1foo", "!bar!", или даже " " (пробел).
document['createElement']('pre');
Это делает тоже, что и предыдущий пример
Имена свойств
Имена свойств могут быть строками. Это значит, что нестроковые объекты могут быть использованы как ключи в объекте. Любой нестроковой объект, включая числа, приводится к строке через метод toString.
var object = {}; object['1'] = 'value'; console.log(object[1]);
Это выводит "value", а 1 приводится к '1'.
var foo = {unique_prop: 1}, bar = {unique_prop: 2}, object = {}; object[foo] = 'value'; console.log(object[bar]);
Также выводит "value", поскольку foo и bar конвертируются в строку. В SpiderMonkey JavaScript движке эта строка будет "['object Object']".
Метод связывания
Метод не связан с объектом его содержащим. В частности, this
незафиксированный метод, т.е., он не обязательно относится к объекту, содержащему метод. this
не выходит за пределы вызываемой функции. Смотрите метод связывания.
Замечание об eval
Новички в JavaScript часто делают ошибку в использовании eval, где скобочная нотация может быть использоваться вместо него. Например, следующий синтаксис часто видели во многих скриптах.
x = eval('document.forms.form_name.elements.' + strFormControl + '.value');
eval
медленный и его следует избегать, насколько это возможно. Также, strFormControl
будет должен удерживать индентификатор, который не требуется для имен и ID форм. Лучше используйте квадратный скобки:
x = document.forms["form_name"].elements[strFormControl].value;
Спецификации
Спецификация | Статус | Комментарий |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Property Accessors' в этой спецификации. |
Стандарт | |
ECMAScript 5.1 (ECMA-262) Определение 'Property Accessors' в этой спецификации. |
Стандарт | |
ECMAScript 1st Edition (ECMA-262) Определение 'Property Accessors' в этой спецификации. |
Стандарт | Изначальное определение. Выполнена в JavaScript 1.0. |
Поддержка браузерами
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Да) | (Да) | (Да) | (Да) | (Да) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Да) | (Да) | (Да) | (Да) | (Да) | (Да) |