ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋‚ด๋ถ€ ์Šฌ๋กฏ(internal slot)๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ(internal method)๋ž€?

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

์ด์ค‘ ๋Œ€๊ด„ํ˜ธ ([[ ... ]])๋กœ ๊ฐ์‹ผ ์ด๋ฆ„๋“ค์ด ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

const o = {};

o.[[Prototype]] // -> Uncaught SyntaxError

0.__proto__ // -> Object.prototype

์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๋‚ด๋ถ€ ๋กœ์ง์ธ ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์ง€๋งŒ,

[[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์˜ ๊ฒฝ์šฐ __proto__๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ์ผ๋ถ€๋Š” ์ ‘๊ทผ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

 


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

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

  • ํ”„๋กœํผํ‹ฐ ์ƒํƒœ : ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’(value), ๊ฐ’์˜ ๊ฐฑ์‹  ์—ฌ๋ถ€(writable), ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€(enumerable), ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€(configurable)
  • ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๊ด€๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ์ƒํƒœ ๊ฐ’์ธ ๋‚ด๋ถ€ ์Šฌ๋กฏ. [[Value]], [[Writable]] , [[Enumerable]] , [[Configurable]] 
const person = { 
    name: 'Lee' 
};

// ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด ๋ฐ˜ํ™˜
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "Lee", writable: true, enumerable: true, configurable: true}

// ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑ
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}

ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋กœ Object.getOwnPropertyDescriptor ๋ฉ”์„œ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ ,  Object.getOwnPropertyDescriptors ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋“ค์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ๋ผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 


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

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

 

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

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

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

 

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

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

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

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

const person = {
    // ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ
    fistName: 'Ungmo',
    lastName: 'Lee'
    
    // fullName์€ ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ
    // getter ํ•จ์ˆ˜
    get fullName() {
    	return `${this.fistName} ${this.lasName}`;
    },
    
    // setter ํ•จ์ˆ˜
    set fullName(name) {
    	// ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น
    	[this.fistName, this.lasName] = name.split(' ');
    }
};

// ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ์ฐธ์กฐ
console.log(person.firstName + ' ' + person.lastName); // Ungmo Lee

// ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ์ €์žฅ
// ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ fullName์— ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด setter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋จ
person.fullName = 'Heegun Lee';
console.log(person); // {fistName: "Heegun", lastName: "Lee"}

// ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ์ฐธ์กฐ
// ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ fullName์— ์ ‘๊ทผํ•˜๋ฉด getter ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋จ
console.log(person.fullName); // Heegun Lee

 


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

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

  • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์ •์˜ ๊ฐ€๋Šฅ
  • Object.defineProperty ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœํผํ‹ฐ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ •์˜
    (์ธ์ˆ˜๋กœ ๊ฐ์ฒด์˜ ์ฐธ์กฐ์™€ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ํ‚ค์ธ ๋ฌธ์ž์—ด, ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ)
const person = {};

// ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ ์ •์˜
Object.defineProperty(person, 'firstName', {
    value: 'Ungmo',
    writable: true,
    enumerable: true,
    configurable: true
});

let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log('firstName', descriptor);
// lastName {value: "Ungmo", writable: true, enumerable: true, configurable: true}

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

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

 


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

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

 

๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ณ€๊ฒฝ ๊ธˆ์ง€ ๊ฐ•๋„์— ๋”ฐ๋ผ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ๋ฉ”์„œ๋“œ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์ฝ๊ธฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์“ฐ๊ธฐ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜
๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€ Object.preventExtenstions X O O O O
๊ฐ์ฒด ๋ฐ€๋ด‰ Object.seal X X O O X
๊ฐ์ฒด ๋™๊ฒฐ Object.freeze X X O X X
// ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€ : ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€๊ฐ€ ๊ธˆ์ง€
Object.perventExtensions(obejct);
Object.isExtensible(object); // true || false๋กœ ํ™•์žฅ ๊ธˆ์ง€ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธ

// ๊ฐ์ฒด ๋ฐ€๋ด‰ : ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋งŒ ๊ฐ€๋Šฅ
Object.seal(obejct);
Object.isSealed(object); // true || false๋กœ ๋ฐ€๋ด‰ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธ

// ๊ฐ์ฒด ๋™๊ฒฐ : ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ
Object.freeze(obejct);
Object.isFrozen(object); // true || false๋กœ ๋™๊ฒฐ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธ

 

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

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

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

 

 

 

 

[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

269๊ฐœ์˜ ๊ทธ๋ฆผ๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ์„ค๋ช…์œผ๋กœ ‘์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ’๋ฅผ ์ดํ•ดํ•˜์ž! ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ ํƒœ์–ด๋‚œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณผ๋„

wikibook.co.kr