์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Flex
- history api
- Gatsby
- ์๊ณ ๋ฆฌ์ฆ
- CSS
- REACT
- ํ๋ก ํธ์๋
- position
- float
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐ๋ธ์ฝ์ค3๊ธฐ
- Props
- ์๋ฐ์คํฌ๋ฆฝํธ
- useRef
- fetch API
- useEffect
- ๋ธ๋ก๊ทธ
- ์ฝ๋ฉํ ์คํธ
- ๋ฐ๋ธ์ฝ์ค
- Today
- Total
Daehyunii's Dev-blog
16์ฅ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ๋ณธ๋ฌธ
16์ฅ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
Daehyunii 2022. 7. 8. 16:0116.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์์๋ ์๋ฌ ๋ฐ์) ์ฃผ์ํด์ผ ํ ๊ฒ์, ์ง๊ธ๊น์ง ์ดํด๋ณธ ๊ฐ์ฒด์ ๋ณ๊ฒฝ ๋ฐฉ์ง ๋ฐฉ๋ฒ๋ค์ ์์ ๋ณ๊ฒฝ ๋ฐฉ์ง๋ก ์ง์ ํ๋กํผํฐ๋ง ๋ณ๊ฒฝ์ด ๋ฐฉ์ง๋๋ค. ์ฆ, ์ค์ฒฉ ๊ฐ์ฒด๊น์ง๋ ์ํฅ์ ์ฃผ์ง๋ ๋ชปํ๋ค.
'๐ Language & CS knowledge > JavaScript (๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ Deep Dive)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
18์ฅ ํจ์์ ์ผ๊ธ ๊ฐ์ฒด (0) | 2022.07.12 |
---|---|
17์ฅ ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ (0) | 2022.07.10 |
15์ฅ let, const ํค์๋์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ (0) | 2022.07.06 |
14์ฅ ์ ์ญ ๋ณ์์ ๋ฌธ์ ์ (0) | 2022.07.04 |
13์ฅ ์ค์ฝํ (0) | 2022.07.03 |