๐Ÿ“‹ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive | 16์žฅ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

waterglassesยท2022๋…„ 4์›” 10์ผ
0
post-thumbnail

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive ๋„์„œ์˜ 16์žฅ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

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

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

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

const o = {};

o.[[Prototype]] // ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€
o.__proto__ //Object.prototype

์œ„์™€ ๊ฐ™์€ [[ProtoType]] ์ด๋ผ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ง์ ‘ ์ ‘๊ทผ์€ ๋ชปํ•˜์ง€๋งŒ ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

ํ”„๋กœํผํ‹ฐ์˜ ์ƒํƒœ๋งˆ๋‹ค ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

  • ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’ : [[Value]]
  • ๊ฐ’์˜ ๊ฐฑ์‹  ๊ฐ€๋Šฅ ์—ฌ๋ถ€: [[Writable]]
  • ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ : [[Enumerable]]
  • ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ : [[configurable]]

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

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

Object.getOwnPropertyDescriptor

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

Object.getOwnPropertyDescriptors

  • ES8์—์„œ ๋„์ž…
  • ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์˜ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋“ค์„ ๋ฐ˜ํ™˜

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

ํ”„๋กœํผํ‹ฐ์˜ ๊ตฌ๋ถ„

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

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

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ •์˜๋จ
ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์„ค๋ช…
[[Value]]value- ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’
[[Writable]]writable- ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ€์ง
[[Enumerable]]enumerable- ํ”„๋กœํผํ‹ฐ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ€์ง
- false์ธ ๊ฒฝ์šฐ for ... in๋ฌธ์ด๋‚˜ Object.keys ๋“ฑ์œผ๋กœ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
[[Configurable]]configurable- ํ”„๋กœํผํ‹ฐ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ€์ง

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

  • ์ž์ฒด์ ์œผ๋กœ ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ
  • ์•„๋ž˜์™€ ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ€์ง
ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์„ค๋ช…
[[Get]]get- ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜
[[Set]]set- ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜
[[Enumerable]]enumerable- ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ [[Enumerable]]์™€ ๊ฐ™๋‹ค.
[[Configurable]]configurable- ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ [[Configurable]]์™€ ๊ฐ™๋‹ค.

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

const person = {
	firstName: 'KilDong',
    lastName: 'Hong',
    
    //fullName์€ ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์ด๋‹ค.(getter ํ•จ์ˆ˜)
    get fullName(){
    	return `${this.firstName} ${this.lastName}`;
    },
    //setter ํ•จ์ˆ˜
    set fullName(name){
    	[this.firstName, this.lastname] = name.split(' ');
    }
}

person.fullName = 'GilDong Hong';
console.log(person.fullName); //GilDong Hong

person ๊ฐ์ฒด์˜ firstName๊ณผ lastName ํ”„๋กœํผํ‹ฐ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์ด๋‹ค. ๋ฉ”์„œ๋“œ ์•ž์— get ,set ๋ฉ”์„œ๋“œ๋Š” getter์™€ setter ํ•จ์ˆ˜์ด๋‹ค. ์ฆ‰ fullName์ด ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์ด๋‹ค.

๋‚ด๋ถ€ ์Šฌ๋กฏ/๋ฉ”์„œ๋“œ ๊ด€์ ์—์„œ ๋ด๋ณด์ž
์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ fullName์œผ๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ [[Get]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  1. ํ”„๋กœํผํ‹ฐ ํ‚ค๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.
  2. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์—์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฒ€์ƒ‰ => person ๊ฐ์ฒด์— fullName ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  3. ๊ฒ€์ƒ‰๋œ fullName ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ์ดํ„ฐ/์ ‘๊ทผ์ž ๋‘ ํ”„๋กœํผํ‹ฐ ์ค‘ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  4. ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Get]]์˜ ๊ฐ’, ์ฆ‰ getter์„ ํ˜ธ์ถœํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

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

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

const person = {};
Object.defineProperty(person, 'firstName',{
	value: 'GilDong'
});
//  ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ˆ„๋ฝ์‹œํ‚ค๋ฉด undefined, false๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.
console.log(Object.getOwnPropertyDescriptor(person, 'firstName'));
// {value:'GilDong', writable: false, ...}
  • ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ˆ„๋ฝ์‹œํ‚ค๋ฉด undefined, false๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.
  • [[Enumerable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ
    - ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋Š” for...in ๋ฌธ์ด๋‚˜ Object.keys ๋“ฑ์œผ๋กœ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
  • [[Writable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ
    - ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ [[Value]] ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋•Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋ฌด์‹œ๋œ๋‹ค.
  • [[Configurable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ
    - ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค. ์ด ๋–„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋ฌด์‹œ๋œ๋‹ค.
    • ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์—†๋‹ค.

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

const person = {};
Object.defineProperty(person, 'fullName',{
	get(){
    	return `${this.firstName} ${this.lastName}`;
    },
    set(name){
    	[this.firstName, this.lastname] = name.split(' ');
    },
    enumerable: true,
    configurable: true
}
  • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ get, set์ผ ๋•Œ ์ƒ๋žตํ•˜๋ฉด undefine๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.

Object.defineProperties

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

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

  • ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๊ธˆ์ง€๋ฅผ ์˜๋ฏธ
  • Object.preventExtensions ๋ฉ”์„œ๋“œ๋กœ ํ™•์žฅ์„ ๊ธˆ์ง€
  • ํ”„๋กœํผํ‹ฐ ๋™์  ์ถ”๊ฐ€์™€ Object.definePropert ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ ๋ฐฉ๋ฒ• ๊ธˆ์ง€
  • ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธ => Object.isExtensible ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธ

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

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

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

  • Object.freeze ๋ฉ”์„œ๋“œ๋กœ ๊ฐ์ฒด ๋™๊ฒฐ
  • ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Object.isFrozen ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

16.5.4 ๋ถˆ๋ณ€ ๊ฐ์ฒด

  • ์œ„์˜ ๋ฐฉ์ง€ ๋ฉ”์„œ๋“œ๋“ค์€ ์–•์€ ๋ณ€๊ฒฝ ๋ฐฉ์ง€๋กœ ์ง์† ํ”„๋กœํผํ‹ฐ๋งŒ ๋ณ€๊ฒฝ์ด ๋ฐฉ์ง€๋˜๊ณ  ์ค‘์ฒฉ ๊ฐ์ฒด๊นŒ์ง€๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€๋Š” ๋ชปํ•œ๋‹ค.
const person {
	name: 'GilDong',
    address:{
    	{ city : 'Joseon' }
    }
}
Object.freeze(person);
console.log(Object.isFrozen(person.address)); //false

person.address.city = 'Korea';
console.log(person); //{name : "GilDong", address: {city : "Korea"}}

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

function deepFreeze(target){
	// ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ๋ฌด์‹œํ•˜๊ณ  ๊ฐ์ฒด์ด๊ณ  ๋™๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋งŒ ๋™๊ฒฐํ•จ!
	if(target && typeof === 'object' && !Object.isFrozon(target)){
    Object.freeze(target};
    }
    Object.keys(target).forEach(key => deepFreeze(target[key]));
    return target;
}

Ref

  • ์ด์›…๋ชจ ์ €, โŒœ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep DiveโŒŸ, ์œ„ํ‚ค๋ถ
profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€