Object.defineProperties()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015ë 7ì.
Object.defineProperties() ë©ìëë ê°ì²´ì ìë¡ì´ ìì±ì ì ìíê±°ë 기존ì ìì±ì ìì íê³ , ê·¸ ê°ì²´ë¥¼ ë°ííë¤.
ìëí´ ë³´ê¸°
const object1 = {};
Object.defineProperties(object1, {
property1: {
value: 42,
writable: true,
},
property2: {},
});
console.log(object1.property1);
// Expected output: 42
문ë²
Object.defineProperties(obj, props);
ì¸ì
-
obj- : ìì±ì ì ìíê±°ë ìì í ê°ì²´.
-
props- : ì ìíê±°ë ìì í ìì±ì ì´ë¦ì í¤ë¡, ê·¸ ìì±ì ìì íë ê°ì²´ë¥¼ ê°ì¼ë¡ ê°ë ê°ì²´.
propsì ê° ê°ì ë°ì´í° ìì ì(data descriptor) í¹ì ì ê·¼ì ìì ì(accessor descriptor) ì¤ íëì¬ì¼ íë©°, ëìì ë ì íì í¬í¨í ì ìë¤(Object.defineProperty()참조).
ë°ì´í° ìì ìì ì ê·¼ì ìì ì 모ë ë¤ì í¤ë¥¼ ì íì ì¼ë¡ í¬í¨í ì ìë¤.
- : ì ìíê±°ë ìì í ìì±ì ì´ë¦ì í¤ë¡, ê·¸ ìì±ì ìì íë ê°ì²´ë¥¼ ê°ì¼ë¡ ê°ë ê°ì²´.
-
configurable- :
trueì¼ ê²½ì° ì´ ìì± ìì ìì íí를 ë³ê²½íê±°ë, ìì±ì í´ë¹ ê°ì²´ìì ìì í ì ìë¤. 기본ê°ìfalseì´ë¤.
- :
-
enumerable- :
trueì¼ ê²½ì° í´ë¹ ê°ì²´ì ìì±ì ì´ê±°í ë ì´ ìì±ì´ ì´ê±°ëë¤. 기본ê°ìfalseì´ë¤. ë°ì´í° ìì ìì ê²½ì° ë¤ì í¤ë¥¼ ì¶ê°ë¡ í¬í¨í ì ìë¤:
- :
-
value- : ì´ ìì±ì ì¤ì í ê°. ì¬ë°ë¥¸ JavaScript ê°(ì«ì, ê°ì²´, í¨ì ë±)ì´ë©´ 무ìì´ë ì¤ì í ì ìë¤.
기본ê°ì
undefinedì´ë¤.
- : ì´ ìì±ì ì¤ì í ê°. ì¬ë°ë¥¸ JavaScript ê°(ì«ì, ê°ì²´, í¨ì ë±)ì´ë©´ 무ìì´ë ì¤ì í ì ìë¤.
기본ê°ì
-
writable- :
trueì¼ ê²½ì° ì´ ìì±ì ì¤ì ë ê°ì í ë¹ ì°ì°ìë¡ ìì í ì ìë¤. 기본ê°ìfalseì´ë¤. ì ê·¼ì ìì ìì ê²½ì° ë¤ì í¤ë¥¼ ì¶ê°ë¡ í¬í¨í ì ìë¤.
- :
-
get -
set- : í´ë¹ ìì±ì setterê° ë í¨ì, í¹ì setterê° ìì ê²½ì°
undefined. ì´ í¨ìë ì´ ìì±ì í ë¹ëë ìë¡ì´ ê°ì ì ì¼í ì¸ìë¡ ë°ëë¤. 기본ê°ìundefinedì´ë¤.< ìì ìê°value,writable,get,setí¤ë¥¼ 모ë ê°ì§ê³ ìì§ ìì ê²½ì° ë°ì´í° ìì ìë¡ ì·¨ê¸íë¤. ìì ìê°valueì´ëwritableê³¼getì´ësetí¤ë¥¼ 모ë ê°ì§ê³ ìì ê²½ì° ìì¸ê° ë°ìíë¤.
- : í´ë¹ ìì±ì setterê° ë í¨ì, í¹ì setterê° ìì ê²½ì°
ë°íê°
í¨ìì ë겨주ìë ê°ì²´.
ì¤ëª
Object.definePropertiesë 기본ì ì¼ë¡ propsì 모ë ì´ê±°ê°ë¥í ìì±ì ë°ë¼ ê°ì²´ objì ìì±ì ì ìíë¤.
ìì
var obj = {};
Object.defineProperties(obj, {
property1: {
value: true,
writable: true,
},
property2: {
value: "Hello",
writable: false,
},
// ë±ë±
});
í´ë¦¬í
모ë ì´ë¦ê³¼ ìì±ì´ ìë ê°ì ê°ë¦¬í¤ë 깨ëí ì¤í íê²½ìì Object.definePropertiesë ë¤ì JavaScript ì¬êµ¬íê³¼ ê±°ì ìë²½íê² ëê°ì´(isCallableì 주ìì 주목) ì¤íëë¤.
function defineProperties(obj, properties) {
function convertToDescriptor(desc) {
function hasProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
function isCallable(v) {
// NB: í¨ìê° ìë ê°ì´ í¸ì¶ê°ë¥í ê²½ì° íìí ì ìì í ê²
return typeof v === 'function';
}
if (typeof desc !== 'object' || desc === null)
throw new TypeError('bad desc');
var d = {};
if (hasProperty(desc, 'enumerable'))
d.enumerable = !!desc.enumerable;
if (hasProperty(desc, 'configurable'))
d.configurable = !!desc.configurable;
if (hasProperty(desc, 'value'))
d.value = desc.value;
if (hasProperty(desc, 'writable'))
d.writable = !!desc.writable;
if (hasProperty(desc, 'get')) {
var g = desc.get;
if (!isCallable(g) && typeof g !== 'undefined')
throw new TypeError('bad get');
d.get = g;
}
if (hasProperty(desc, 'set')) {
var s = desc.set;
if (!isCallable(s) && typeof s !== 'undefined')
throw new TypeError('bad set');
d.set = s;
}
if (('get' in d || 'set' in d) && ('value' in d || 'writable' in d))
throw new TypeError('identity-confused descriptor');
return d;
}
if (typeof obj !== 'object' || obj === null)
throw new TypeError('bad obj');
properties = Object(properties);
var keys = Object.keys(properties);
var descs = [];
for (var i = 0; i < keys.length; i++)
descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);
for (var i = 0; i < descs.length; i++)
Object.defineProperty(obj, descs[i][0], descs[i][1]);
return obj;
}
ëª ì¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-object.defineproperties> |