Baseline Widely available
СводкаСÑаÑиÑеÑкий меÑод Object.defineProperty()
опÑеделÑÐµÑ Ð½Ð¾Ð²Ð¾Ðµ или изменÑÐµÑ ÑÑÑеÑÑвÑÑÑее ÑвойÑÑво обÑекÑа и возвÑаÑÐ°ÐµÑ ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ.
const object1 = {};
Object.defineProperty(object1, "property1", {
value: 42,
writable: false,
});
object1.property1 = 77;
// Throws an error in strict mode
console.log(object1.property1);
// Expected output: 42
СинÑакÑиÑ
Object.defineProperty(obj, prop, descriptor)
ÐаÑамеÑÑÑ
obj
ÐбÑекÑ, на коÑоÑом опÑеделÑеÑÑÑ ÑвойÑÑво.
prop
СÑÑока или Symbol
Ñ ÐºÐ»ÑÑом опÑеделÑемого или изменÑемого ÑвойÑÑва.
descriptor
ÐеÑкÑипÑÐ¾Ñ Ð¾Ð¿ÑеделÑемого или изменÑемого ÑвойÑÑва.
ÐÑÐ¾Ñ Ð¼ÐµÑод позволÑÐµÑ ÑоÑно добавлÑÑÑ Ð¸Ð»Ð¸ изменÑÑÑ ÑвойÑÑва обÑекÑа. ÐбÑÑное добавление ÑвойÑÑв ÑеÑез пÑиÑваивание ÑоздаÑÑ ÑвойÑÑва, коÑоÑÑе можно ÑвидеÑÑ ÑеÑез пеÑеÑиÑление ÑвойÑÑв (Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñикла for...in
или меÑода Object.keys
), ÑÑи знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¸ коÑоÑÑе могÑÑ Ð±ÑÑÑ ÑдаленÑ. ÐÑÐ¾Ñ Ð¶Ðµ меÑод позволÑÐµÑ Ð½Ð°ÑÑÑоиÑÑ ÑÑи дополниÑелÑнÑе деÑали ÑвойÑÑва.
ÐеÑкÑипÑоÑÑ ÑвойÑÑв, пÑиÑÑÑÑÑвÑÑÑие в обÑекÑÐ°Ñ , бÑваÑÑ Ð´Ð²ÑÑ Ð¾ÑновнÑÑ Ñипов: деÑкÑипÑоÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸ деÑкÑипÑоÑÑ Ð´Ð¾ÑÑÑпа. ÐеÑкÑипÑÐ¾Ñ Ð´Ð°Ð½Ð½ÑÑ â ÑÑо ÑвойÑÑво, имеÑÑее знаÑение, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ (а Ð¼Ð¾Ð¶ÐµÑ Ð¸ не бÑÑÑ) запиÑÑваемÑм. ÐеÑкÑипÑÐ¾Ñ Ð´Ð¾ÑÑÑпа â ÑÑо ÑвойÑÑво, опиÑÑваемое паÑой ÑÑнкÑий â геÑÑеÑом и ÑеÑÑеÑом. ÐеÑкÑипÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко Ñем-Ñо одним из ÑÑÐ¸Ñ Ð´Ð²ÑÑ Ñипов; он не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно обоими.
РдеÑкÑипÑÐ¾Ñ Ð´Ð°Ð½Ð½ÑÑ , и деÑкÑипÑÐ¾Ñ Ð´Ð¾ÑÑÑпа ÑвлÑÑÑÑÑ Ð¾Ð±ÑекÑами. Ðни обладаÑÑ ÑледÑÑÑими обÑзаÑелÑнÑми клÑÑами:
configurable
Равен true
ÑолÑко в Ñом ÑлÑÑае, еÑли Ñип ÑÑого деÑкÑипÑоÑа ÑвойÑÑва Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñн и еÑли ÑвойÑÑво Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдалено из ÑодеÑжаÑего его обÑекÑа. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено в false
.
enumerable
Равен true
ÑолÑко в Ñом ÑлÑÑае, еÑли ÑÑо ÑвойÑÑво можно ÑвидеÑÑ ÑеÑез пеÑеÑиÑление ÑвойÑÑв ÑодеÑжаÑего его обÑекÑа. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено в false
.
ÐеÑкÑипÑÐ¾Ñ Ð´Ð°Ð½Ð½ÑÑ Ñакже Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑледÑÑÑие дополниÑелÑнÑе клÑÑи:
value
ÐнаÑение, аÑÑоÑииÑованное Ñо ÑвойÑÑвом. ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑбÑм допÑÑÑимÑм знаÑением JavaScript (ÑиÑлом, обÑекÑом, ÑÑнкÑией и Ñ.д.). ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено в undefined
.
writable
Равен true
ÑолÑко в Ñом ÑлÑÑае, еÑли знаÑение, аÑÑоÑииÑованное Ñо ÑвойÑÑвом, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа пÑиÑваиваниÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено в false
.
ÐеÑкÑипÑÐ¾Ñ Ð´Ð¾ÑÑÑпа Ñакже Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑледÑÑÑие дополниÑелÑнÑе клÑÑи:
get
ФÑнкÑиÑ, иÑполÑзÑÐµÐ¼Ð°Ñ ÐºÐ°Ðº геÑÑÐµÑ ÑвойÑÑва, либо undefined
, еÑли ÑвойÑÑво не Ð¸Ð¼ÐµÐµÑ Ð³ÐµÑÑеÑа. ÐозвÑаÑаемое знаÑение ÑÑнкÑии бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÐºÐ°Ðº знаÑение ÑвойÑÑва. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено в undefined
.
set
ФÑнкÑиÑ, иÑполÑзÑÐµÐ¼Ð°Ñ ÐºÐ°Ðº ÑеÑÑÐµÑ ÑвойÑÑва, либо undefined
, еÑли ÑвойÑÑво не Ð¸Ð¼ÐµÐµÑ ÑеÑÑеÑа. ФÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑм аÑгÑменÑом новое знаÑение, пÑиÑваиваемое ÑвойÑÑвÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено в undefined
.
ÐмейÑе в видÑ, ÑÑо ÑÑи клÑÑи не обÑзаÑелÑно Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑинадлежаÑÑ ÑÐ°Ð¼Ð¾Ð¼Ñ Ð´ÐµÑкÑипÑоÑÑ ÑвойÑÑва, еÑли они ÑнаÑледованÑ, они Ñак же бÑдÑÑ Ð¿ÑинимаÑÑÑÑ Ð²Ð¾ внимание. ÐÐ»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑÑиÑ
клÑÑей по ÑмолÑÐ°Ð½Ð¸Ñ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñми, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе заÑанее замоÑозиÑÑ Object.prototype
, Ñвно опÑеделив вÑе клÑÑи, либо ÑÑÑановиÑÑ ÑвойÑÑво Object.prototype.__proto__
в null
.
// ÐÑполÑзование __proto__
Object.defineProperty(obj, "key", {
__proto__: null, // Ð½ÐµÑ ÑнаÑледованнÑÑ
ÑвойÑÑв
value: "static", // по ÑмолÑаниÑ
// не пеÑеÑиÑлÑеÑÑÑ,
// не наÑÑÑаиваеÑÑÑ Ð¸
// не пеÑезапиÑÑваеÑÑÑ
});
// Явное опÑеделение ÑвойÑÑва
Object.defineProperty(obj, "key", {
enumerable: false,
configurable: false,
writable: false,
value: "static",
});
// ÐеÑеиÑполÑзование одного и Ñого же обÑекÑа
function withValue(value) {
var d =
withValue.d ||
(withValue.d = {
enumerable: false,
writable: false,
configurable: false,
value: null,
});
d.value = value;
return d;
}
// ... и ...
Object.defineProperty(obj, "key", withValue("static"));
// ÐÑли доÑÑÑпен меÑод freeze, пÑедоÑвÑаÑаем добавление ÑвойÑÑв
// value, get, set, enumerable, writable и configurable
// к пÑоÑоÑÐ¸Ð¿Ñ Object
(Object.freeze || Object)(Object.prototype);
ÐÑимеÑÑ ÐÑимеÑ: Ñоздание ÑвойÑÑва
ÐÑли Ñказанное ÑвойÑÑво не ÑÑÑеÑÑвÑÐµÑ Ð² обÑекÑе, меÑод Object.defineProperty()
ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ ÑвойÑÑво по пеÑÐµÐ´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¾Ð¿Ð¸ÑаниÑ. ÐÐ¾Ð»Ñ Ð² деÑкÑипÑоÑе могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÑенÑ, в ÑÑом ÑлÑÑае иÑ
знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð·Ð½Ð°ÑениÑми по ÑмолÑаниÑ. ÐÑе логиÑеÑкие Ð¿Ð¾Ð»Ñ Ð±ÑдÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð² false
. ÐÐ¾Ð»Ñ value
, get
и set
по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑдÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð² undefined
. СвойÑÑво, опÑеделÑнное без аÑÑибÑÑов get
/set
/value
/writable
назÑваеÑÑÑ Â«Ð¾Ð±Ñим», а деÑкÑипÑÐ¾Ñ Ð´Ð°Ð½Ð½ÑÑ
â «ÑиповÑм».
var o = {}; // СоздаÑм новÑй обÑекÑ
// ÐÑÐ¸Ð¼ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑвойÑÑва к обÑекÑÑ ÑеÑез defineProperty()
// Ñ Ð´ÐµÑкÑипÑоÑом даннÑÑ
Object.defineProperty(o, "a", {
value: 37,
writable: true,
enumerable: true,
configurable: true,
});
// СвойÑÑво 'a' ÑÑÑеÑÑвÑÐµÑ Ð² обÑекÑе o и Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, Ñавное 37
// ÐÑÐ¸Ð¼ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑвойÑÑва к обÑекÑÑ ÑеÑез defineProperty()
// Ñ Ð´ÐµÑкÑипÑоÑом доÑÑÑпа
var bValue = 38;
Object.defineProperty(o, "b", {
get: function () {
return bValue;
},
set: function (newValue) {
bValue = newValue;
},
enumerable: true,
configurable: true,
});
o.b; // 38
// СвойÑÑво 'b' ÑÑÑеÑÑвÑÐµÑ Ð² обÑекÑе o и Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, Ñавное 38
// ÐнаÑение ÑвойÑÑва o.b ÑепеÑÑ Ð¸Ð´ÐµÐ½ÑиÑно знаÑÐµÐ½Ð¸Ñ bValue до ÑеÑ
поÑ,
// пока ÑвойÑÑво o.b не бÑÐ´ÐµÑ Ð¿ÐµÑеопÑеделено
// ÐÑ Ð½Ðµ можеÑе ÑмеÑаÑÑ Ð´Ð²Ð° ÑÑиÑ
подÑ
ода:
Object.defineProperty(o, "conflict", {
value: 0x9f91102,
get: function () {
return 0xdeadbeef;
},
});
// ÐÑÐºÐ¸Ð½ÐµÑ Ð¸ÑклÑÑение TypeError: ÑвойÑÑво value пÑименимо ÑолÑко в
// деÑкÑипÑоÑаÑ
даннÑÑ
, ÑвойÑÑво get пÑименимо ÑолÑко в деÑкÑипÑоÑаÑ
// доÑÑÑпа
ÐÑимеÑ: изменение ÑвойÑÑва
ÐÑли ÑвойÑÑво Ñже ÑÑÑеÑÑвÑеÑ, меÑод Object.defineProperty()
попÑÑаеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÑвойÑÑво в ÑооÑвеÑÑÑвии Ñо знаÑениÑми в деÑкÑипÑоÑе и ÑекÑÑим ÑоÑÑоÑнием обÑекÑа.
ÐÑли Ñ ÑÑаÑого деÑкÑипÑоÑа аÑÑибÑÑ configurable
бÑл ÑÑÑановлен в false
, Ñо ÑвойÑÑво ÑвлÑеÑÑÑ Ð½ÐµÐ½Ð°ÑÑÑаиваемÑм. ÐелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð°ÑÑибÑÑÑ Ð½ÐµÐ½Ð°ÑÑÑаиваемÑÑ
ÑвойÑÑв, а Ñакже нелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ñип деÑкÑипÑоÑа. ÐÐ»Ñ ÑвойÑÑв даннÑÑ
Ñ writable: true
можно изменÑÑÑ Ð·Ð½Ð°Ñение и изменÑÑÑ Ð°ÑÑибÑÑ writable
Ñ true
на false
. ÐÑи попÑÑке измениÑÑ Ð½ÐµÐ½Ð°ÑÑÑаиваемÑе аÑÑибÑÑÑ ÑвойÑÑв Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка TypeError
. ÐÑклÑÑÐµÐ½Ð¸Ñ ÑоÑÑавлÑÑÑ Ð°ÑÑибÑÑÑ value
и writable
(еÑли ÑÑо ÑазÑеÑено) и еÑли новое знаÑение ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸ÑÑ
однÑм знаÑением ÑвойÑÑва даннÑÑ
.
ÐÑли ÑвойÑÑво ÑвлÑеÑÑÑ Ð½Ð°ÑÑÑаиваемÑм, Ñо ÑÑÑановка аÑÑибÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ undefined
Ñавно его ÑдалениÑ. ÐапÑимеÑ, еÑли o.k
ÑÑо ÑвойÑÑво доÑÑÑпа, Ñо вÑзов Object.defineProperty(o, "k", { set: undefined })
ÑÐ´Ð°Ð»Ð¸Ñ ÑеÑÑеÑ, оÑÑавив Ñ k
ÑолÑко геÑÑеÑ, Ñо еÑÑÑ ÑÐ´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ доÑÑÑпнÑм ÑолÑко Ð´Ð»Ñ ÑÑениÑ. ÐÑли аÑÑибÑÑ Ð¾ÑÑÑÑÑÑвÑÐµÑ Ð² новом деÑкÑипÑоÑе, Ñо беÑÑÑÑÑ Ð·Ð½Ð°Ñение аÑÑибÑÑа из ÑÑаÑого деÑкÑипÑоÑа (Ñо еÑÑÑ Ð½Ðµ пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÑвного пеÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð° undefined
). Ðожно пеÑеклÑÑаÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑазнÑми Ñипами деÑкÑипÑоÑов (ÑвойÑÑва даннÑÑ
или доÑÑÑпа). ÐапÑимеÑ, еÑли новÑй деÑкÑипÑÐ¾Ñ â ÑÑо деÑкÑипÑÐ¾Ñ Ð´Ð°Ð½Ð½ÑÑ
(Ñ value
или writable
), Ñо аÑÑибÑÑÑ get
и set
оÑигиналÑного деÑкÑипÑоÑа бÑдÑÑ ÑдаленÑ.
writable
ÐÑли аÑÑибÑÑ writable
ÑвойÑÑва ÑÑÑановлен в false
, ÑвойÑÑво ÑÑановиÑÑÑ Â«Ð½ÐµÐ·Ð°Ð¿Ð¸ÑÑваемÑм». ÐÐ¼Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ бÑÐ´ÐµÑ Ð¿ÑиÑвоиÑÑ Ð½Ð¾Ð²Ð¾Ðµ знаÑение.
var o = {}; // СоздаÑм новÑй обÑекÑ
Object.defineProperty(o, "a", {
value: 37,
writable: false,
});
console.log(o.a); // ÐÑÐ²ÐµÐ´ÐµÑ 37
o.a = 25; // ÐÑклÑÑение не бÑÐ´ÐµÑ Ð²ÑбÑоÑено (бÑÐ´ÐµÑ Ð²ÑбÑоÑено ÑолÑко в
// ÑÑÑогом Ñежиме, даже еÑли знаÑение бÑÐ´ÐµÑ Ñем же ÑамÑм)
console.log(o.a); // ÐÑÐ²ÐµÐ´ÐµÑ 37. ÐÑиÑваивание не ÑÑабоÑало.
Ðак видно в ÑÑом пÑимеÑе, попÑÑка запиÑи в незапиÑÑваемое ÑвойÑÑво его не изменило, но и иÑклÑÑение Ñак же не бÑло вÑбÑоÑено.
ÐÑÑибÑÑenumerable
ÐÑÑибÑÑ enumerable
ÑвойÑÑва опÑеделÑеÑ, пÑоÑмаÑÑиваеÑÑÑ Ð»Ð¸ ÑвойÑÑво в Ñикле for...in
и меÑодом Object.keys()
или неÑ.
var o = {};
Object.defineProperty(o, "a", { value: 1, enumerable: true });
Object.defineProperty(o, "b", { value: 2, enumerable: false });
// ÐÑÑибÑÑ enumerable по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлен в false
Object.defineProperty(o, "c", { value: 3 });
o.d = 4; // ÐÑи Ñоздании ÑвойÑÑва пÑÑÑм пÑиÑваиваниÑ, аÑÑибÑÑ enumerable
// по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑанавливаеÑÑÑ Ð² true
for (var i in o) {
console.log(i);
}
// ÐÑÐ²ÐµÐ´ÐµÑ 'a' и 'd' (поÑÑдок вÑвода не опÑеделÑн)
Object.keys(o); // ['a', 'd']
o.propertyIsEnumerable("a"); // true
o.propertyIsEnumerable("b"); // false
o.propertyIsEnumerable("c"); // false
ÐÑÑибÑÑ configurable
ÐÑÑибÑÑ configurable
одновÑеменно конÑÑолиÑÑеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸ ÑвойÑÑво бÑÑÑ Ñдалено из обÑекÑа и могÑÑ Ð»Ð¸ бÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ ÐµÐ³Ð¾ аÑÑибÑÑÑ (кÑоме конÑÑÐ¾Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð°ÑÑибÑÑа writable
).
var o = {};
Object.defineProperty(o, "a", {
get: function () {
return 1;
},
configurable: false,
});
Object.defineProperty(o, "a", { configurable: true }); // ÐÑÐºÐ¸Ð½ÐµÑ TypeError
Object.defineProperty(o, "a", { enumerable: true }); // ÐÑÐºÐ¸Ð½ÐµÑ TypeError
Object.defineProperty(o, "a", { set: function () {} }); // ÐÑÐºÐ¸Ð½ÐµÑ TypeError (Ñанее ÑвойÑÑво set деÑкÑипÑоÑа не бÑло опÑеделено)
Object.defineProperty(o, "a", {
get: function () {
return 1;
},
}); // ÐÑÐºÐ¸Ð½ÐµÑ TypeError (даже неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо get Ð´ÐµÐ»Ð°ÐµÑ Ñо же, ÑÑо и ÑанÑÑе)
Object.defineProperty(o, "a", { value: 12 }); // ÐÑÐºÐ¸Ð½ÐµÑ TypeError
console.log(o.a); // ÐÑÐ²ÐµÐ´ÐµÑ 1
delete o.a; // ÐиÑего не пÑоизойдÑÑ
console.log(o.a); // ÐÑÐ²ÐµÐ´ÐµÑ 1
ÐÑли Ð±Ñ Ð°ÑÑибÑÑ configurable
обÑекÑа o.a
бÑл ÑÑÑановлен в true
, никакие оÑибки не бÑли Ð±Ñ Ð²ÑбÑоÑÐµÐ½Ñ Ð¸ в конÑе ÑвойÑÑво бÑло Ð±Ñ Ñдалено.
Ðажно понимаÑÑ, как ÑÑÑанавливаÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð°ÑÑибÑÑам ÑвойÑÑв. ЧаÑÑо ÑÑÑеÑÑвÑÐµÑ ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоÑÑÑм назнаÑением знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑедÑÑвом ÑоÑеÑной ноÑаÑии и иÑполÑзованием меÑода Object.defineProperty()
, ÑÑо и показÑÐ²Ð°ÐµÑ Ð¿ÑÐ¸Ð¼ÐµÑ Ð½Ð¸Ð¶Ðµ.
var o = {};
o.a = 1;
// ÐквиваленÑно запиÑи:
Object.defineProperty(o, "a", {
value: 1,
writable: true,
configurable: true,
enumerable: true,
});
// С дÑÑгой ÑÑоÑонÑ,
Object.defineProperty(o, "a", { value: 1 });
// ÑквиваленÑно запиÑи:
Object.defineProperty(o, "a", {
value: 1,
writable: false,
configurable: false,
enumerable: false,
});
ÐÑимеÑ: полÑзоваÑелÑÑкие ÑеÑÑеÑÑ Ð¸ геÑÑеÑÑ
ÐÑÐ¸Ð¼ÐµÑ Ð½Ð¸Ð¶Ðµ показÑваеÑ, как ÑеализоваÑÑ ÑамоаÑÑ
ивиÑÑÑÑийÑÑ Ð¾Ð±ÑекÑ. ÐÑи ÑÑÑановке ÑвойÑÑва temperature
в маÑÑив archive
Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¶ÑÑнала.
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, "temperature", {
get: function () {
console.log("get!");
return temperature;
},
set: function (value) {
temperature = value;
archive.push({ val: temperature });
},
});
this.getArchive = function () {
return archive;
};
}
var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
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