getter

Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

Синтаксис 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 Latest Draft (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) Нет Нет Нет

Смотрите также

Метки документа и участники

Метки: 
 Внесли вклад в эту страницу: etokareva
 Обновлялась последний раз: etokareva,