๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํด ECMA Script ์ฌ์์์ ์ฌ์ฉํ๋ ์์ฌ ํ๋กํผํฐ์ ์์ฌ ๋ฉ์๋๋ค. ECMAScript ์ฌ์์ ๋ฑ์ฅํ๋ ์ด์ค ๋๊ดํธ([[...]])๋ก ๊ฐ์ผ ์ด๋ฆ๋ค์ด ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ด๋ค.
๋ด๋ถ ๋ฉ์๋์ ๋ด๋ถ ์ฌ๋กฏ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ด๋ถ ๋ก์ง์ด๋ฏ๋ก ์์น์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ๊ฑฐ๋ ํธ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์๋๋ค. ๋จ, ์ผ๋ถ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ํํ์ฌ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์๋จ์ ์ ๊ณตํ๊ธฐ๋ ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์ํ๋ค. ํ๋กํผํฐ์ ์ํ๋ ํ๋กํผํฐ์ ๊ฐ, ๊ฐ์ ๊ฐฑ์ ๊ฐ๋ฅ ์ฌ๋ถ, ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ, ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋งํ๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ์ง์ ์ ๊ทผํ ์ ์์ง๋ง Object.getOwnPropertyDesciptor
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์ ์๋ค. Object.getOwnPropertyDesciptor
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๊ณ , ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ ํ๋กํผํฐ ํค๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ฌํ๋ค.
์ด ๋ Object.getOwnPropertyDesciptor
๋ฉ์๋๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
ํ๋กํผํฐ๋ ์ ๊ทผ์ ํ๋กํผํฐ(get/set ๋ฉ์๋๋ฅผ ๊ฐ์ง)๋ ๋ฐ์ดํฐ ํ๋กํผํฐ(value๋ฅผ ๊ฐ์ง) ์ค ํ ์ข ๋ฅ์๋ง ์ํ๊ณ ๋ ๋ค์ ์ํ ์ ์๋ค.
๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ํ๋กํผํฐ. ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ํ๋กํผํฐ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ์ด๋ค.
๋ฐ์ดํฐ ํ๋กํผํฐ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ๋๋ค. ์ด ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์๋๋ค.
์ ๊ทผ์ ํ๋กํผํฐ๋ ์์ฒด์ ์ผ๋ก๋ ๊ฐ์ ๊ฐ์ง ์๊ณ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ํ๋กํผํฐ๋ค.
์ฆ, ํ๋กํผํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ํธ์ถํ๋ ํจ์๋ฅผ ๊ฐ ๋์ ์ ์ง์ ํ ์ ์๋ ํ๋กํผํฐ์ด๋ค.
์ ๊ทผ์ ํ๋กํผํฐ์ ๋ณธ์ง์ ํจ์์ธ๋ฐ, ์ด ํจ์๋ ๊ฐ์ ํ๋(get)ํ๊ณ ์ค์ (set)ํ๋ ์ญํ ์ ๋ด๋นํ๋ค. ๊ทธ๋ฐ๋ฐ ์ธ๋ถ ์ฝ๋์์๋ ํจ์๊ฐ ์๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ์ฒ๋ผ ๋ณด์ธ๋ค.
์ ๊ทผ์ ํ๋กํผํฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ฐ๋๋ค.
์ ๊ทผ์ ํ๋กํผํฐ๋ getter/setter ํจ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
๐ง ํ๋กํ ํ์
ํ๋กํ ํ์ ์ ์ด๋ค ๊ฐ์ฒด์ ์์(๋ถ๋ชจ) ๊ฐ์ฒด์ ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ค. ํ๋กํ ํ์ ์ ํ์(์์) ๊ฐ์ฒด์๊ฒ ์์ ์ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์ํ๋ค. ํ๋กํ ํ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ํ์ ๊ฐ์ฒด๋ ์์ ์ ํ๋กํผํฐ ๋๋ ๋ฉ์๋์ธ ๊ฒ์ฒ๋ผ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ํ๋กํผํฐ ์ ์๋ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ํ๊ฑฐ๋, ๊ธฐ์กด ํ๋กํผํฐ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ํ๋๊ฒ์ ๋งํ๋ค. Object.defineProperty
๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํ๋กํผํฐ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ์ํ ์ ์๋ค.
Object.preventExtensions
๋ฉ์๋๋ ๊ฐ์ฒด์ ํ์ฅ์ ๊ธ์งํ๋ค. ๊ฐ์ฒด ํ์ฅ ๊ธ์ง๋ ํ๋กํผํฐ ์ถ๊ฐ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. ์ฆ ํ์ฅ์ด ๊ธ์ง๋ ๊ฐ์ฒด๋ ํ๋กํผํฐ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๋ค.
Object.seal
๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ดํ๋ค. ๊ฐ์ฒด ๋ฐ๋ด์ด๋ ํ๋กํผํฐ ์ถ๊ฐ ๋ฐ ์ญ์ ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ๋ฐ๋ด๋ ๊ฐ์ฒด๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
Object.freeze
๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ๋ค. ๊ฐ์ฒด ๋๊ฒฐ์ด๋ ํ๋กํผํฐ ์ถ๊ฐ ๋ฐ ์ญ์ ์ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ ๊ธ์ง, ํ๋กํผํฐ ๊ฐ ๊ฐฑ์ ๊ธ์ง๋ฅผ ์๋ฏธํ๋ค. ์ฆ ๋๊ฒฐ๋ ๊ฐ์ฒด๋ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
์์์ ์ดํด๋ณธ ๋ณ๊ฒฝ ๋ฐฉ์ง ๋ฉ์๋๋ค์ ์์ ๋ณ๊ฒฝ ๋ฐฉ์ง๋ก ์ง์ ํ๋กํผํฐ๋ง ๋ณ๊ฒฝ์ด ๋ฐฉ์ง๋๊ณ ์ค์ฒฉ ๊ฐ์ฒด๊น์ง๋ ์ํฅ์ ์ฃผ์ง๋ ๋ชปํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด์ ์ค์ฒฉ ๊ฐ์ฒด๊น์ง ๋๊ฒฐํ์ฌ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ์ฝ๊ธฐ ์ ์ฉ์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ํ๋กํผํฐ์ ๋ํด ์ฌ๊ท์ ์ผ๋ก Object.freeze
๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ค.