Baseline Widely available
СинÑакÑÐ¸Ñ 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]() { ... } }ÐаÑамеÑÑÑ
prop
ÐÐ¼Ñ ÑвойÑÑва Ð´Ð»Ñ Ð¿ÑивÑзÑÐ²Ð°Ð½Ð¸Ñ Ðº заданной ÑÑнкÑии.
expression
ÐаÑÐ¸Ð½Ð°Ñ Ñ ECMAScript 6, Ð²Ñ Ñакже можеÑе иÑполÑзоваÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑÑиÑлÑемого имени ÑвойÑÑва Ð´Ð»Ñ Ð¿ÑивÑзки к заданной ÑÑнкÑии.
Ðногда желаÑелÑно ÑазÑеÑиÑÑ Ð´Ð¾ÑÑÑп к ÑвойÑÑвÑ, коÑоÑое возвÑаÑÐ°ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки вÑÑиÑлÑемое знаÑение, или Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе Ð·Ð°Ñ Ð¾ÑеÑÑ Ð¾ÑÑажаÑÑ ÑоÑÑоÑние внÑÑÑенней пеÑеменной без Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑвнÑÑ Ð²Ñзовов меÑодов. Ð 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
:
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
и Object.defineProperty()
даÑÑ Ð¿Ð¾Ñ
ожие ÑезÑлÑÑаÑÑ, но пÑи иÑполÑзовании в classes
Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ еÑÑÑ ÑÐ¾Ð½ÐºÐ°Ñ ÑазниÑа.
ÐÑи иÑполÑзовании 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 }
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4