๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

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

๐Ÿ“š Language & CS knowledge/JavaScript (๋ชจ๋˜์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive)

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

Daehyunii 2022. 7. 8. 16:01

16.1 ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ

  ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ECMAScript ์‚ฌ์–‘์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜์‚ฌ ํ”„๋กœํผํ‹ฐ์™€ ์˜์‚ฌ ๋ฉ”์„œ๋“œ๋‹ค. ECMAScript ์‚ฌ์–‘์— ๋“ฑ์žฅํ•˜๋Š” ์ด์ค‘ ๋Œ€๊ด„ํ˜ธ( [[...]] )๋กœ ๊ฐ์‹ผ ์ด๋ฆ„๋“ค์ด ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋‹ค. ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๋‚ด๋ถ€ ๋กœ์ง์ด๋ฏ€๋กœ ์›์น™์ ์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ, ์ผ๋ถ€ ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์— ํ•œํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•  ๋ฟ์ด๋‹ค. (ex __proto__)

 

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

  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜ํ•œ๋‹ค. ์ฆ‰ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ๋“ค์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ Object. getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

const person = {
    name : 'lee'
};

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

์ด๋•Œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ์ƒ์†๋ฐ›์€ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์š”๊ตฌํ•˜๋ฉด undefined๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. 

 

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

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

- ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ : ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœํผํ‹ฐ

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

 

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

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

ํ”„๋กœํผํ‹ฐ
์–ดํŠธ๋ฆฌ๋ทฐํŠธ
ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ
๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ
์„ค๋ช…
[[Value]] value - ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์ด๋‹ค.

- ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด [[Value]]์— ๊ฐ’์„ ์žฌํ• ๋‹น ํ•œ๋‹ค.
[[Writable]] writable - ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ 
๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

- [[Writable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ [[Value]]์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
[[Enumerable]] enumerable - ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ
๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

- [[Enumerable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋Š” for...in ๋ฌธ์ด๋‚˜ Object.keys ๋ฉ”์„œ๋“œ ๋“ฑ์œผ๋กœ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
[[Configurable]] configurable - ํ”„๋กœํผํ‹ฐ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ
๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

- [[Configurable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ์‚ญ์ œ, ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๊ธˆ์ง€๋œ๋‹ค. ๋‹จ [[Writable]]์ด true์ธ ๊ฒฝ์šฐ [[Value]]์˜ ๋ณ€๊ฒฝ๊ณผ [[Writable]]์„ flase๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋œ๋‹ค.
const person = {
    name : 'lee'
};

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

 

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

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

ํ”„๋กœํผํ‹ฐ 
์–ดํŠธ๋ฆฌ๋ทฐํŠธ
ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ
๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ
์„ค๋ช…
[[Get]] get - ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋‹ค. 

- ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Get]]์˜ ๊ฐ’, ์ฆ‰
getter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. (getterํ•จ์ˆ˜)
[[Set]] set - ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋‹ค.

- ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Set]]์˜ ๊ฐ’, ์ฆ‰
setter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์ €์žฅ๋œ๋‹ค. (setterํ•จ์ˆ˜)
[[Enumerable]] enumerable ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ๋™์ผ
[[Configurable]] configurable ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ๋™์ผ

 

16.4 ํ”„๋กœํผํ‹ฐ ์ •์˜

  ํ”„๋กœํผํ‹ฐ ์ •์˜๋ž€ ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ์˜ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

const person = {};

Object.defineProperty(person, 'firstName', {
    value : 'lee',
    writable : true,
    enumerable : true,
    configurable : true
});

console.log(person); // {firstName: 'lee'}
console.log(Object.getOwnPropertyDescriptor(person, 'firstName'));
// {value: 'lee', writable: true, enumerable: true, configurable: true}
// ์ด ์ฒ˜๋Ÿผ ๋นˆ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ ์ •์˜๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Object.defineProperty ๋ฉ”์„œ๋“œ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ผ๋ถ€ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์—์„œ ์ƒ๋žต๋œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์ ์šฉ๋œ๋‹ค. 

ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ƒ๋žตํ–ˆ์„ ๋•Œ์˜ ๊ธฐ๋ณธ๊ฐ’
value [[Value]] undefined
get [[Get]] undefined
set [[Set]] undefined
writable [[Writable]] false
enumerable [[Enumerable]] false
configurable [[Configurable]] false

16.5 ๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€

  ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋ฏ€๋กœ ์žฌํ• ๋‹น ์—†์ด ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 

๊ตฌ๋ถ„ ๋ฉ”์„œ๋“œ ํ”„๋กœํผํ‹ฐ
์ถ”๊ฐ€
ํ”„๋กœํผํ‹ฐ
์‚ญ์ œ
ํ”„๋กœํผํ‹ฐ
๊ฐ’ ์ฝ๊ธฐ
ํ”„๋กœํผํ‹ฐ 
๊ฐ’ ์“ฐ๊ธฐ
ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜
๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€ Object.preventExtensions x o o o o
๊ฐ์ฒด ๋ฐ€๋ด‰ Object.seal x x o o x
๊ฐ์ฒด ๋™๊ฒฐ Object.freeze x x o x x

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

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

const person = { name : 'lee' };

Object.preventExtensions(person);

console.log(Object.isExtensible(person)); // false

person.age = 30; // ๋ฌด์‹œ๋œ๋‹ค(strict mode์—์„œ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ)

console.log(person); // {name: 'lee'}

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

  Object.seal ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ€๋ด‰ํ•œ๋‹ค. ๋ฐ€๋ด‰๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ€๋ด‰๋œ ๊ฐ์ฒด์ธ์ง€ ์—ฌ๋ถ€๋Š” Object.isSealed ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ๊ธˆ์ง€๋œ ์‚ฌํ•ญ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฌด์‹œ๋œ๋‹ค.(strict mode์—์„œ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ)

 

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

  Object.freeze ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋™๊ฒฐํ•œ๋‹ค. ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋™๊ฒฐ๋œ ๊ฐ์ฒด์ธ์ง€ ์—ฌ๋ถ€๋Š” Object.isFrozen ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ๊ธˆ์ง€๋œ ์‚ฌํ•ญ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฌด์‹œ๋œ๋‹ค.(strict mode์—์„œ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ) ์ฃผ์˜ํ•ด์•ผ ํ•  ๊ฒƒ์€, ์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•๋“ค์€ ์–•์€ ๋ณ€๊ฒฝ ๋ฐฉ์ง€๋กœ ์ง์† ํ”„๋กœํผํ‹ฐ๋งŒ ๋ณ€๊ฒฝ์ด ๋ฐฉ์ง€๋œ๋‹ค. ์ฆ‰, ์ค‘์ฒฉ ๊ฐ์ฒด๊นŒ์ง€๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€๋Š” ๋ชปํ•œ๋‹ค.