--- title: getter slug: Web/JavaScript/Reference/Functions/get tags: - геттер translation_of: Web/JavaScript/Reference/Functions/get ---
Синтаксис get
связывает свойство объекта с функцией, которая будет вызываться при обращении к этому свойству.
Исходный код этого интерактивного примера хранится в GitHub репозитории. Если вы хотите внести свой вклад в проект интерактивных примеров, пожалуйста, клонируйте https://github.com/mdn/interactive-examples и отправьте нам PR запрос.
{get prop() { ... } } {get [expression]() { ... } }
prop
expression
Иногда желательно разрешить доступ к свойству, которое возвращает динамически вычисляемое значение, или Вы можете захотеть отражать состояние внутренней переменной без необходимости использования явных вызовов методов. В JavaScript, это можно реализовать при помощи использования геттера.
Невозможно сделать так, чтобы геттер был привязан к свойству и одновременно чтобы это свойство действительно содержало значение, хотя можно использовать геттер и сеттер в сочетании, чтобы создать тип псевдо-свойство.
Учтите следующее при работе с синтаксисом get
:
{ get x() { }, get x() { } }
и { x: ..., get x() { } }
запрещены).Геттер можно удалить при помощи оператора delete
.
Ниже создается псевдо-свойство latest
для объекта obj
, который выведет последний элемент массива в консоль лог.
const obj = { log: ['example','test'], get latest() { if (this.log.length === 0) return undefined; return this.log[this.log.length - 1]; } } console.log(obj.latest); // "test"
Обратите внимание, что попытка присвоить значение latest
не изменит его.
Если Вы хотите удалить геттер, используйте delete
:
delete obj.latest;
defineProperty
Для добавления геттера к существующему объекту в любое время используйте Object.defineProperty().
const 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()
.
get
и defineProperty
Использование ключевого слова get
и {{jsxref("Object.defineProperty()")}} дает похожие результаты, но при использовании в {{jsxref("classes")}} между ними есть тонкая разница.
При использовании get
свойство будет определено в прототипе объекта, в то время, как при использовании {{jsxref ("Object.defineProperty ()")}} свойство будет определено в экземпляре, к которому применяется.
class Example { get hello() { return 'world'; } } const obj = new Example(); console.log(obj.hello); // "world" console.log(Object.getOwnPropertyDescriptor(obj, 'hello')); // undefined console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'hello')); // { configurable: true, enumerable: false, get: function get hello() { return 'world'; }, set: undefined }
Спецификация | Статус | Комментарии |
---|---|---|
{{SpecName('ES5.1', '#sec-11.1.5', 'Object Initializer')}} | {{Spec2('ES5.1')}} | Первоначальное определение. |
{{SpecName('ES6', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ES6')}} | Добавлено вычисляемое именное свойство. |
{{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.functions.get")}}