16.1 ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋
๋ด๋ถ ์ฌ๋กฏ (internal slot)๊ณผ ๋ด๋ถ ๋ฉ์๋ (internal method)๋ JS ์์ง์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํด ECMAScript ์ฌ์์์ ์ฌ์ฉํ๋ ์์ฌ ํ๋กํผํฐ pseudo property์ ์์ฌ ๋ฉ์๋ pseudo method ์ ๋๋ค.
๋ชจ๋ ๊ฐ์ฒด๋ [[Prototype]] ์ด๋ผ๋ ๋ด๋ถ ์ฌ๋กฏ์ ๊ฐ์ต๋๋ค. ๋ด๋ถ ์ฌ๋กฏ์ JS ์์ง์ ๋ด๋ถ ๋ก์ง์ด๋ฏ๋ก ์์น์ ์ผ๋ก ์ง์ ์ ๊ทผํ ์ ์์ง๋ง __proto__๋ฅผ ํตํด ๊ฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
16.2 ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด
Js ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์ํฉ๋๋ค. ํ๋กํผํฐ์ ์ํ๋ ๊ฐ (value), ๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅ ์ฌ๋ถ (writable), ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ (enumerable), ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ (configurable)๋ฅผ ๋งํฉ๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ์ง์ ์ ๊ทผํ ์ ์์ง๋ง ์๋์ ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
const person = { name: "Lee" };
Object.getOwnPropertyDescriptor(person, 'name');
// {value: 'Lee', writable: true, enumerable: true, configurable: true}
16.3 ๋ฐ์ดํฐ ํ๋กํผํฐ์ ์ ๊ทผ์ ํ๋กํผํฐ
๋ฐ์ดํฐ ํ๋กํผํฐ (data property) : ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ
์ ๊ทผ์ ํ๋กํผํฐ (accessor property) : ์์ฒด์ ์ธ ๊ฐ์ ๊ฐ์ง ์๊ณ , ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์ (accessor function)์ผ๋ก ๊ตฌ์ฑ๋ ํ๋กํผํฐ
16.3.1 ๋ฐ์ดํฐ ํ๋กํผํฐ (data property)
JS์์ง์ด ํ๋กํผํฐ๋ฅผ ์์ฑ ํ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์๋ฉ๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
[[Vaule]] | value | ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ๋๋ ๊ฐ |
[[Writable]] | writable | ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ์ |
[[Enumerable]] | enumerable | ํ๋กํผํฐ์ ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ์ |
[[Configurable]] | configurable | ํ๋กํผํฐ์ ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ์ |
16.3.2 ์ ๊ทผ์ ํ๋กํผํฐ
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
[[Get]] | get | ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ์ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์. getter ํจ์๊ฐ ํธ์ถ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋กํผํฐ ๊ฐ์ผ๋ก ๋ฐํ๋จ |
[[Set]] | set | ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ ๊ฐ์ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์, setter ํจ์๊ฐ ํธ์ถ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ ์ฅ |
[[Enumerable]] | enumerable | |
[[Configurable]] | configurable |
16.4 ํ๋กํผํฐ ์ ์
ํ๋กํผํฐ ์ ์๋ ํ๋กํผํฐ ๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง, ์ด๊ฑฐ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง, ์ฌ์ ์ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง ๋ฑ์ ์ ์ํ ์ ์์ต๋๋ค.
16.5 ๊ฐ์ฒด ๋ณ๊ฒฝ ๋ฐฉ์ง
๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ด๋ฏ๋ก ์ฌํ ๋น ์์ด ์ง์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. JS๋ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ตฌ๋ถ | ๋ฉ์๋ | ํ๋กํผํฐ ์ถ๊ฐ | ํ๋กํผํฐ ์ญ์ | ํ๋กํผํฐ ๊ฐ ์ฝ๊ธฐ | ํ๋กํผํฐ ๊ฐ ์ฐ๊ธฐ | ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ |
๊ฐ์ฒด ํ์ฅ ๊ธ์ง | Object.oporeventExtensions | X | O | O | O | O |
๊ฐ์ฒด ๋ฐ๋ด | Object.seal | X | X | O | O | X |
๊ฐ์ฒด ๋๊ฒฐ | Object.freeze | X | X | O | X | X |
Reference: ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive