[JavaScript] 14. ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
๐ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ต์ฌ) 16์ฅ. ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
01. ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋
- ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ดํดํ๊ธฐ ์ํ ๊ฐ๋ ์ด๋ค.
- ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํด ECMAScript ์ฌ์์์ ์ฌ์ฉํ๋ ์์ฌ ํ๋กํผํฐ(pseudo property)์ ์์ฌ ๋ฉ์๋(pseudo method)๋ค.
- โ ๏ธ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์ค์ ๋ก ๋์ํ์ง๋ง, ์ธ๋ถ๋ก ๊ณต๊ฐ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค. -> ์ง์ ์ ๊ทผํ ์ ์๋ค.
02. ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์ํ๋ค.
- ํ๋กํผํฐ์ ์ํ : ํ๋กํผํฐ์ ๊ฐ(value), ๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅ ์ฌ๋ถ(writable), ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ(enumerable), ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ(configurable)
- ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ : ๋ด๋ถ ์ํ ๊ฐ์ธ ๋ด๋ถ ์ฌ๋กฏ [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]
- ํ๋กํผํฐ์ ์ง์ ์ ๊ทผ X, Object.getOwnPropertyDescriptor ๋ฉ์๋ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ํ์ธ O
๐ฅ๏ธ ์์ ์ฝ๋
const person = {
name: 'Lee'
};
// ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "Lee", writable: true, enumerable: true, configurable: true}
โก๏ธ Object.getOwnPropertyDescriptor ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์) ๊ฐ์ฒด์ ์ฐธ์กฐ ์ ๋ฌ, ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์) ํ๋กํผํฐ ํค๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ฌ
โก๏ธ ํ๋กํผํฐ ๋์คํธ๋ฆฝํฐ ๊ฐ์ฒด(ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด ์ ๊ณต) ๋ฐํ
โ ๏ธ ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ / ์์๋ฐ์ ํ๋กํผํฐ์ ๋ํ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ์๊ตฌ -> undefined ๋ฐํ
03. ๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ
1) ๋ฐ์ดํฐ ํ๋กํผํฐ
ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ
๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
[[Value]] | value | 1. ํ๋กํผํฐ ํค๋ฅผ ํตํด ๊ฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ๋๋ ๊ฐ. 2. ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด [[Value]]์ ๊ฐ์ ์ฌํ ๋น. / ์ด๋ ํ๋กํผํฐ ์์ผ๋ฉด ๋์ ์์ฑํ์ฌ ์ ์ฅ |
[[Writable]] | writable | 1. ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ - ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ์ง 2. [[Writable]]์ ๊ฐ์ด false์ธ ๊ฒฝ์ฐ, ์ฝ๊ธฐ ์ ์ฉ ํ๋กํผํฐ๊ฐ ๋จ |
[[Enumerable]] | enumerable | 1. ํ๋กํผํฐ์ ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ - ๋ถ๋ฆฌ์ธ ๊ฐ 2. [[Enumerable]]์ ๊ฐ์ด false ์ธ ๊ฒฝ์ฐ, for...in๋ฌธ์ด๋ Object.keys ๋ฉ์๋ ๋ฑ์ผ๋ก ์ด๊ฑฐ ๋ถ๊ฐ |
[[Configurable]] | configurable | 1. ํ๋กํผํฐ ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ - ๋ถ๋ฆฌ์ธ ๊ฐ 2. [[Configurable]]์ ๊ฐ์ด false ์ธ ๊ฒฝ์ฐ, ์ญ์ , ๊ฐ์ ๋ณ๊ฒฝ ๊ธ์ง ๋จ, [[Writable]]์ด true์ธ ๊ฒฝ์ฐ, [[Valule]]์ ๋ณ๊ฒฝ๊ณผ [[Writable]]์ false๋ก ๋ณ๊ฒฝ ํ์ฉ |
2) ์ ๊ทผ์ ํ๋กํผํฐ
์์ฒด์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ง ์๊ณ , ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ํ๋กํผํฐ
๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
[[Get]] | get | 1. ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ์ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์ 2. [[Get]]์ ๊ฐ, ์ฆ getter ํจ์ ํธ์ถ -> ํ๋กํผํฐ ๊ฐ์ผ๋ก ๋ณํ |
[[Set]] | set | 1. ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์ 2. [[Set]]์ ๊ฐ, ์ฆ setter ํจ์ ํธ์ถ -> ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ ์ฅ |
[[Enumerable]] | enumerable | ๋ฐ์ดํฐ ํ๋กํผํฐ์ [[Enumerable]]๊ณผ ๊ฐ๋ค |
[[Configurable]] | configurable | ๋ฐ์ดํฐ ํ๋กํผํฐ์ [[Configurable]]๊ณผ ๊ฐ๋ค |
๐ก ์ ๊ทผ์ ํจ์๋ getter/setter ํจ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
04. ํ๋กํผํฐ ์ ์
ํ๋กํผํฐ ์ ์๋ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํ๊ฑฐ๋, ๊ธฐ์กด ํ๋กํผํฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๋งํ๋ค.
โก๏ธ ํ๋กํผํฐ ๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง, ํ๋กํผํฐ๋ฅผ ์ด๊ฑฐ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง, ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง ์ ์
โก๏ธ Object.defineProperty ๋ฉ์๋ ์ฌ์ฉ
โก๏ธ ์ธ์ -> ๊ฐ์ฒด์ ์ฐธ์กฐ, ๋ฐ์ดํฐ ํ๋กํผํฐ์ ํค์ธ ๋ฌธ์์ด, ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด ์ ๋ฌ
๐ฅ๏ธ ์์ ์ฝ๋
const person = {};
// ๋ฐ์ดํฐ ํ๋กํผํฐ ์ ์
Object.defineProperty(person, 'firstName', {
value: 'Ungmo',
writable: true,
enumerable: true,
configurable: true
});
Object.defineProperty(person, 'lastname', {
value:'Lee'
});
let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log('firstName', descriptor);
// firstName {value: "Ungmo", writable: true, enumerable: true, configurable: true}
โ ๏ธ Object.defineProperty ๋ฉ์๋๋ ํ๋ฒ์ ํ๋์ ํ๋กํผํฐ๋ง ์ ์ํ ์ ์๋ค.
โก๏ธ Object.defineProperties ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ํ๋กํผํฐ๋ฅผ ํ ๋ฒ์ ์ ์ํ ์ ์๋ค.
05. ๊ฐ์ฒด ๋ณ๊ฒฝ ๋ฐฉ์ง
๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ด๋ฏ๋ก ์ฌํ ๋น ์์ด ์ง์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
๊ฐ๋จํ ํ๋ก ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ตฌ๋ถ | ๋ฉ์๋ | ํ๋กํผํฐ ์ถ๊ฐ | ํ๋กํผํฐ ์ญ์ | ํ๋กํผํฐ ๊ฐ ์ฝ๊ธฐ |
ํ๋กํผํฐ ๊ฐ ์ฐ๊ธฐ |
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ |
๊ฐ์ฒด ํ์ฅ ๊ธ์ง | Object.preventExtensions | X | O | O | O | O |
๊ฐ์ฒด ๋ฐ๋ด | Object.seal | X | X | O | O | X |
๊ฐ์ฒด ๋๊ฒฐ | Object.freeze | X | X | O | X | X |
๐ ์ฐธ๊ณ ์๋ฃ