๐Ÿค ์€์ง€log ๐Ÿค

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋ณธ๋ฌธ

๐Ÿ’œ ๋ชจ๋˜Javascript

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

Eun_zii 2022. 9. 28. 14:22

๐ŸŽฃ ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ

๋Š” ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ์—”์ง„์˜ ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ECMAScript ์‚ฌ์–‘์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜์‚ฌ ํ”„๋กœํผํ‹ฐ์™€ ์˜์‚ฌ ๋ฉ”์„œ๋“œ ๋‹ค.

์ด์ค‘ ๋Œ€๊ด„ํ˜ธ [[...]]๋กœ ๊ฐ์‹ผ ์ด๋ฆ„๋“ค์ด ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋‹ค.
๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๋‚ด๋ถ€ ๋กœ์ง์ด๋ฏ€๋กœ ์›์น™์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐ŸŽฃ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ• ๋•Œ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ 

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜ ํ•œ๋‹ค. (ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ž€ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’, ๊ฐ’์˜ ๊ฐฑ์‹  ๊ฐ€๋Šฅ ์—ฌ๋ถ€, ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€, ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋งํ•œ๋‹ค.)

 

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๊ด€์ดํ•˜๋Š” ๋‚ด๋ถ€ ์ƒํƒœ ๊ฐ’์ธ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[value]], [[Writalbe]], [[Enumerablr]], [[Configuralbe]] ์ด๋‹ค.

  • ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค.
  • Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const person = {
  name: 'Lee'
};
// ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑ
person.age = 20; 
console.log(Object.getOwnPropertyDescriptors(person));
/* 
{
name: {value: 'Lee', writable: true, enumerable: true, configurable: true}
age: {value: 20, writable: true, enumerable: true, configurable: true}
[[Prototype]]: Object 
}
*/

๐ŸŽฃ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ๋ถ„ํ• ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ : ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœํผํ‹ฐ๋‹ค.
  • ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ : ์ž์ฒด์ ์œผ๋กœ๋Š” ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ• ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ ์ด๋‹ค.

๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ

const person = {
  name: 'Lee'
};
console.log(Object.getOwnPropertyDescriptor(person,'name'));
// {value: 'Lee', writable: true, enumerable: true, configurable: true}

์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

์ ‘๊ทผ์ž ํ•จ์ˆ˜๋Š” getter/setter ํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋Š” getter๊ณผ setter ํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ•˜๋‚˜๋งŒ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์™€ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•

// ์ผ๋ฐ˜ ๊ฐ์ฒด์˜ __proto__๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ๋‹ค.
Object.getOwnPropertyDescriptor(Object.prototype,'__proto__');
// {enumerable: false, configurable: true, get: ƒ, set: ƒ}

// ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ prototype์€ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ ๋‹ค.
Object.getOwnPropertyDescriptor(function() {},'prototype');
// {value: {…}, writable: true, enumerable: false, configurable: false}

๐ŸŽฃ ํ”„๋กœํผํ‹ฐ ์ •์˜

ํ”„๋กœํผํ‹ฐ ์ •์˜๋ž€ ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ์˜ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์žฌ์ •์˜ ํ•˜๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค.
Object.defineProperty ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ์ˆ˜๋กœ๋Š” ๊ฐ์ฒด์˜ ์ฐธ์กฐ์™€ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ key์ธ ๋ฌธ์ž์—ด, ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  • Object.defineProperty ๋ฉ”์„œ๋“œ๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ๋งŒ ์ •์˜ํ• ์ˆ˜ ์žˆ๋‹ค.
  • Object.defineProperties ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽฃ ๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€

๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€

Object.preventExtentions ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ํ™•์žฅ์„ ๊ธˆ์ง€ ํ•œ๋‹ค. ( ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€๋ž€ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๊ธˆ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. - ํ™•์žฅ์ด ๊ธˆ์ง€๋œ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€๊ฐ€ ๊ธˆ์ง€๋œ๋‹ค.)

  • ํ”„๋กœํผํ‹ฐ๋Š” ํ”„๋กœํผํ‹ฐ ๋™์  ์ถ”๊ฐ€์™€ Object.defineProperty ๋ฉ”์„œ๋“œ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋‘๊ฐ€์ง€ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•์ด ๋ชจ๋‘ ๊ธˆ์ง€๋œ๋‹ค.

๊ฐ์ฒด ๋ฐ€๋ด‰

Object.seal ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ€๋ด‰ํ•œ๋‹ค. ( ๊ฐ์ฒด ๋ฐ€๋ด‰ ์ด๋ž€ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ์™€ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜ ๊ธˆ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. )

  • ๋ฐ€๋ด‰๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ฐ์ฒด ๋™๊ฒฐ

Object.freeze ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•œ๋‹ค. ( ๊ฐ์ฒด ๋™๊ฒฐ ์ด๋ž€ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ์™€ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜ ๊ธˆ์ง€, ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๊ฐฑ์‹  ๊ธˆ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. )

  • ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
728x90