Эта статья нуждается в редакционном обзоре. Как вы можете помочь.
Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.
Синтаксис get
связывает свойство объекта с функцией, которая будет вызываться при обращении к этому свойству.
Синтаксис
{get prop() { ... } } {get [expression]() { ... } }
Параметры
prop
- Имя свойства для привязывания к заданной функции.
- expression
- Начиная с ECMAScript 6, Вы также можете использовать выражения для вычисляемого имени свойства для привязки к заданной функции.
Описание
Иногда желательно разрешить доступ к свойству, которое возвращает динамически вычисляемое значение, или Вы можете захотеть отражать состояние внутренней переменной без необходимости использования явных вызовов методов. В JavaScript, это можно реализовать при помощи использования геттера. Невозможно сделать так, чтобы геттер был привязан к свойству и одновременно чтобы это свойство действительно содержало значение, хотя можно использовать геттер и сеттер в сочетании, чтобы создать тип псевдо-свойство.
Учтите следующее при работе с синтаксисом get:
- Он может иметь идентификатор, который является либо числом, либо строкой;
- Он должен иметь только нулевые параметры (смотрите Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments для доп. информации);
- Он не должен появляться в объектном литерале вместе с другим get или через ввод данных для того же свойства (
{ get x() { }, get x() { } }
и{ x: ..., get x() { } }
запрещены).
Геттер можно удалить при помощи оператора delete
.
Примеры
Определение геттера на новом объекте в момент инициализации этого объекта
Ниже создается псевдо-свойство latest для объекта obj, который выведет последний элемент массива в консоль лог.
var log = ['test']; var obj = { get latest () { if (log.length == 0) return undefined; return log[log.length - 1] } } console.log (obj.latest); // Вернет "test".
Обратите внимание, что попытка присвоить значение latest
не изменят его.
Удаление геттера оператором delete
Если Вы хотите удалить геттер, используйте delete
:
delete obj.latest;
Определение геттера на уже существующих объектах с помощью defineProperty
Для добавления геттера к существующему объекту в любое время используйте Object.defineProperty().
var o = { a:0 } Object.defineProperty(o, "b", { get: function () { return this.a + 1; } }); console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)
Использование вычисляемого именованного свойства
Примечание: Вычисляемые свойства являются экспериментальной технологией, частью предложений спецификации ECMAScript 6, и массовой поддержки браузерами пока нет. Код ниже вызовет синтаксическую ошибку в неподдерживаемых средах.
var expr = "foo"; var obj = { get [expr]() { return "bar"; } }; console.log(obj.foo); // "bar"
Умные / самостоятельно перезаписывающиеся/ ленивые геттеры
Геттеры дают нам возможность определять свойство объекта , но они не вычисляют значение этого свойства до тех пор, пока оно не станет доступно. Геттер откладывает стоимость вычисления значения до тех пор, пока это значение не станет нужно, и если оно никогда не понадобится, то вы никогда не заплатите.
Дополнительная техника оптимизации заключается в том, чтобы лениться или откладывать вычисление значения свойства и кэшировать его для дальнейшего доступа. Так поступают умные или запоминающие геттеры. Значение вычисляется в первый раз при вызове геттера и затем сохраняется в кэше так, что последующие обращения будут возвращать кэшированные значения без его пересчета. Это полезно в следующих ситуациях:
- Если вычисление значения свойства дорого (занимает много оперативной памяти или процессорного времени, порождает рабочий поток, получает удаленный файл, и т. д.).
- Если сейчас это значение не нужно. Оно будет использоваться позже, или в некоторых случаях оно не используется вообще.
- Если оно используется, к нему будут обращаться несколько раз, и нет необходимости его пересчитывать, так как значение не будет изменено, или не должно пересчитываться.
Значит, Вам не нужно использовать ленивый геттер для свойства, значение которого Вы собираетесь менять потому, что геттер не будет пересчитывать значение.
В следующем примере у объекта есть геттер как собственное свойство. При получении свойства, свойство удаляется из объекта и вновь добавляется, но в этот раз неявно, как свойство с данными. В итоге значение возвращается.
get notifier() { delete this.notifier; return this.notifier = document.getElementById("bookmarked-notification-anchor"); },
Для Firefox смотреите также модуль XPCOMUtils.jsm , который определяет функцию defineLazyGetter()
.
Спецификации
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 5.1 (ECMA-262) Определение 'Object Initializer' в этой спецификации. |
Стандарт | Первоначальное определение. |
ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Method definitions' в этой спецификации. |
Стандарт | Добавлено вычисляемое именное свойство. |
ECMAScript 2016 Draft (7th Edition, ECMA-262) Определение 'Method definitions' в этой спецификации. |
Черновик |
Совместимость с браузерами
Особенность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | 1 | 2.0 (1.8.1) | 9 | 9.5 | 3 |
Вычисляемые именные свойства | 46 | 34 (34) | Нет | Нет | Нет |
Особенность | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | (Да) | (Да) | 1.0 (1.8.1) | (Да) | (Да) | (Да) |
Вычисляемые именные свойства | Нет | Нет | 34.0 (34.0) | Нет | Нет | Нет |
Смотрите также
- сеттер
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Defining Getters and Setters in JavaScript Guide