get
Baseline Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Синтаксис get привязывает свойство объекта к функции, которая будет вызываться при обращении к этому свойству. Его также можно использовать в классах.
Попробуйте
const obj = {
log: ["a", "b", "c"],
get latest() {
return this.log[this.log.length - 1];
},
};
console.log(obj.latest);
// Expected output: "c"
Синтаксис
{ get prop() { /* … */ } }
{ get [expression]() { /* … */ } }
Существуют некоторые дополнительные синтаксические ограничения:
- У getter должно быть ровно ноль параметров.
Параметры
-
prop - Имя свойства, которое будет связано с данной функцией. Как и другие свойства в инициализаторах объектов, это может быть строковый литерал, числовой литерал или идентификатор.
-
expression - Вы также можете использовать выражения для вычисляемого имени свойства, чтобы связать его с данной функцией.
Описание
Иногда желательно разрешить доступ к свойству, которое возвращает динамически вычисляемое значение, или вы можете захотеть отразить состояние внутренней переменной, не требуя явных вызовов методов. В JavaScript это можно сделать с помощью getter.
Свойство объекта является либо свойством данных, либо свойством-аксессором, но оно не может быть одновременно и тем, и другим. Читайте Object.defineProperty() для получения дополнительной информации. Синтаксис getter позволяет указать функцию getter в инициализаторе объекта.
const obj = {
get prop() {
// getter, the code executed when reading obj.prop
return someValue;
},
};
Свойства, определенные с использованием этого синтаксиса, являются собственными свойствами создаваемого объекта, и они являются настраиваемыми и перечислимыми.
Примеры
Определение getter для новых объектов в инициализаторах объектов
Это создаст псевдо-свойство latest для объекта obj, которое будет возвращать последний элемент массива в log.
const obj = {
log: ["example", "test"],
get latest() {
return this.log.at(-1);
},
};
console.log(obj.latest); // "test"
Обратите внимание, что попытка присвоить значение latest не изменит его.
Использование getter в классах
Вы можете использовать тот же синтаксис для определения публичных геттеров экземпляра, доступных для экземпляров класса. В классах вам не нужен разделитель-запятая между методами.
class ClassWithGetSet {
#msg = "hello world";
get msg() {
return this.#msg;
}
set msg(x) {
this.#msg = `hello ${x}`;
}
}
const instance = new ClassWithGetSet();
console.log(instance.msg); // "hello world"
instance.msg = "cake";
console.log(instance.msg); // "hello cake"
Свойства getter определяются в свойстве prototype класса и, следовательно, совместно используются всеми экземплярами класса. В отличие от свойств getter в объектных литералах, свойства getter в классах не перечисляются.
Статические геттеры и приватные геттеры используют схожие синтаксисы, которые описаны на страницах static и приватные элементы.
Удаление getter с помощью оператора delete
Если вы хотите удалить getter, вы можете просто delete его:
delete obj.latest;
Определение getter для существующих объектов с помощью defineProperty
Чтобы добавить getter к существующему объекту позже в любое время, используйте Object.defineProperty().
const o = { a: 0 };
Object.defineProperty(o, "b", {
get() {
return this.a + 1;
},
});
console.log(o.b); // Runs the getter, which yields a + 1 (which is 1)
Использование вычисляемого имени свойства
const expr = "foo";
const obj = {
get [expr]() {
return "bar";
},
};
console.log(obj.foo); // "bar"
Определение статических геттеров
class MyConstants {
static get foo() {
return "foo";
}
}
console.log(MyConstants.foo); // 'foo'
MyConstants.foo = "bar";
console.log(MyConstants.foo); // 'foo', a static getter's value cannot be changed
Умные / самоперезаписываемые / ленивые геттеры
Геттеры предоставляют способ определить свойство объекта, но они не вычисляют значение свойства до тех пор, пока к нему не обратятся. Геттер откладывает стоимость вычисления значения до тех пор, пока значение не понадобится. Если оно никогда не понадобится, вы никогда не заплатите за его стоимость.
Дополнительным методом оптимизации для ленивого или отложенного вычисления значения свойства и его кеширования для последующего доступа являются умные (или мемоизированные) геттеры. Значение вычисляется при первом вызове геттера, а затем кешируется, так что последующие обращения возвращают кешированное значение без перевычисления. Это полезно в следующих ситуациях:
- Если вычисление значения свойства является дорогостоящим (требует много ОЗУ или процессорного времени, запускает рабочие потоки, извлекает удаленный файл и т. д.).
- Если значение не нужно прямо сейчас. Оно будет использовано позже, а в некоторых случаях оно вообще не будет использовано.
- Если оно используется, оно будет доступно несколько раз, и нет необходимости пересчитывать значение, которое никогда не изменится или не должно быть пересчитано.
Примечание: Это означает, что вам не следует писать ленивый геттер для свойства, значение которого, как вы ожидаете, изменится, потому что если геттер ленивый, он не будет пересчитывать значение.
Обратите внимание, что геттеры по своей природе не являются "ленивыми" или " мемоизированными "; вы должны реализовать этот метод, если желаете такого поведения.
В следующем примере объект имеет getter в качестве собственного свойства. При доступе к свойству оно удаляется из объекта и добавляется снова, но на этот раз неявно как свойство данных. Наконец, возвращается значение.
const obj = {
get notifier() {
delete this.notifier;
this.notifier = document.getElementById("bookmarked-notification-anchor");
return this.notifier;
},
};
Обнаружение функций
Многие функции принимают объект и извлекают из него отдельные свойства как отдельные параметры (этот объект-параметр известен как options bag). Вы можете обнаружить, поддерживается ли конкретный параметр, используя getter для отслеживания того, было ли извлечено свойство. Этот пример проверяет, поддерживается ли параметр colorType методом HTMLCanvasElement.getContext().
function isColorTypeSupported() {
let supported = false;
const obj = {
get colorType() {
supported = true;
return undefined;
},
};
document.createElement("canvas").getContext("2d", obj);
return supported;
}
get против. defineProperty
Хотя использование ключевого слова get и Object.defineProperty() дают схожие результаты, существует тонкое различие между ними при использовании в классах. Синтаксис get определяет свойство в прототипе экземпляра, в то время как 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 }
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
get |
1 |
12 |
1.5 |
9.5 |
3 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
computed_property_names |
46 |
12 |
34 |
47 |
9.1 |
46 |
34 |
33 |
9.3 |
5.0 |
46 |
9.3 |
1.0.0 |
1.0 |
4.0.0 |
См. также
- Руководство по работе с объектами
- Функции
setObject.defineProperty()- Инициализатор объектов
class- Аксессоры свойств
- Несовместимое изменение ES5: функции literal getter и setter теперь должны иметь ровно ноль или один аргумент Джеффа Уолдена (2010)
- Больше изменений SpiderMonkey: удаляется древний, эзотерический, очень редко используемый синтаксис для создания getter и setter Джеффа Уолдена (2010)
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get