From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../javascript/reference/functions/get/index.html | 180 +++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 files/ru/web/javascript/reference/functions/get/index.html (limited to 'files/ru/web/javascript/reference/functions/get') diff --git a/files/ru/web/javascript/reference/functions/get/index.html b/files/ru/web/javascript/reference/functions/get/index.html new file mode 100644 index 0000000000..9e2c329c8e --- /dev/null +++ b/files/ru/web/javascript/reference/functions/get/index.html @@ -0,0 +1,180 @@ +--- +title: getter +slug: Web/JavaScript/Reference/Functions/get +tags: + - геттер +translation_of: Web/JavaScript/Reference/Functions/get +--- +
{{jsSidebar("Functions")}}
+ +

Синтаксис get связывает свойство объекта с функцией, которая будет вызываться при обращении к этому свойству.

+ +
{{EmbedInteractiveExample("pages/js/functions-getter.html")}}
+ + + +

Синтаксис

+ +
{get prop() { ... } }
+{get [expression]() { ... } }
+ +

Параметры

+ +
+
prop
+
Имя свойства для привязывания к заданной функции.
+
expression
+
Начиная с ECMAScript 6, Вы также можете использовать выражения для вычисляемого имени свойства для привязки к заданной функции.
+
+ +

Описание

+ +

Иногда желательно разрешить доступ к свойству, которое возвращает динамически вычисляемое значение, или Вы можете захотеть отражать состояние внутренней переменной без необходимости использования явных вызовов методов. В JavaScript, это можно реализовать при помощи использования геттера.

+ +

Невозможно сделать так, чтобы геттер был привязан к свойству и одновременно чтобы это свойство действительно содержало значение, хотя можно использовать геттер и сеттер в сочетании, чтобы создать тип псевдо-свойство.

+ +

Учтите следующее при работе с синтаксисом get:

+ +
+ +
+ +

Геттер можно удалить при помощи оператора 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:

+ +
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")}}

+ +

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

+ + -- cgit v1.2.3-54-g00ecf