์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ฉฐ, ์์ ๊ฐ์ ์ ์ธํ ๋๋จธ์ง ๊ฐ์ ๋ชจ๋ ๊ฐ์ฒด๋ค.
๊ฐ์ฒด๋ 0๊ฐ ์ด์์ ํ๋กํผํฐ๋ก ๊ตฌ์ฑ๋ ์งํฉ์ด๋ฉฐ, ํ๋กํผํฐ๋ ํค(key)์ ๊ฐ(value)๋ก ๊ตฌ์ฑ๋๋ค. ํ๋กํผํฐ ๊ฐ์ด ํจ์์ผ ๊ฒฝ์ฐ, ์ผ๋ฐ ํจ์์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋ฉ์๋(method)๋ผ ๋ถ๋ฅธ๋ค.
์ด์ฒ๋ผ ๊ฐ์ฒด๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ก ๊ตฌ์ฑ๋ ์งํฉ์ฒด๋ค.
์์ง์ด ๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ์์ ๊ตฌํ ์์กด์ (Implementation-Dependent)์ด๋ค. ๊ฐ์ฒด ์ปจํ ์ด๋์ ๋ด์ง ์๋ ๊ฒ ์ผ๋ฐ์ ์ด๋ค. ๊ฐ์ฒด ์ปจํ ์ด๋์๋ ์ค์ ๋ก ๊ฐ์ด ์๋ ๊ณณ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ(๋ ํผ๋ฐ์ค) ์ญํ ์ ๋ด๋นํ๋ ํ๋กํผํฐ๋ช ์ด ๋ด๊ฒจ์๋ค.
๊ฐ์ฒด๋ ํ๋กํผํฐ์ ์งํฉ์ด๋ฉฐ ํ๋กํผํฐ๋ ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
ํ๋กํผํฐ ํค์ ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ณ์ ๋ค์ด๋ฐ ๊ท์น์ ๋ฐ๋ฅด์ง ์๋ ๊ฐ์ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ ์ ์์ง๋ง ๊ถ์ฅํ์ง ์๋๋ค. ๊ทธ ์ธ์๋ ํ๋กํผํฐ ํค๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค. ์๋ ์์๋ฅผ ํตํด ์ดํด๋ณด์
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋ ๊ฐ์ฒด(์ผ๊ธ ๊ฐ์ฒด)๋ค. ๋ฐ๋ผ์ ํจ์๋ ๊ฐ์ผ๋ก ์ทจ๊ธํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ฌ์ฉ๋ ํจ์๋ฅผ ๋ฉ์๋๋ผ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฌ๋ ์๊ฐ๋ณด๋ค ๋ฉ์๋๋ก ์ธ์ ๋๋ ๋ฒ์๊ฐ ์๋นํ ์ข๋ค. ์ด๋ ํจ์์ ๋ํด ๋ค๋ฃจ๋ฉด์ ์์๋ณด๋๋ก ํ์.
const crew = {
name: 'Harry',
greeting: function () {
console.log(`Hello!, I'm ${this.name});
}
}
console.log(crew.name) // Harry
console.log(crew["name"]) // Harry
ํ๋กํผํฐ ํค๊ฐ ์๋ณ์ ๋ค์ด๋ฐ ๊ท์น์ ์ค์ํ์ง ์๋๋ค๋ฉด, ๋ฐ๋์ ๋๊ดํธ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํด์ผํ๋ค. ๋๊ดํธ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋กํผํฐ ํค๋ ๋ฐ๋์ ๋ฐ์ดํ๋ก ๊ฐ์ผ ๋ฌธ์์ด์ด์ด์ผํ๋ค. ๋จ, ํ๋กํผํฐ ํค๊ฐ ์ซ์๋ก ์ด๋ค์ง ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ๋ฐ์ดํ๋ฅผ ์๋ตํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด๋ Essential Internal Methods๋ก [[Get]], [[Set]] ํจ์๋ฅผ ๊ฐ์ง๋ค. ์ด๋ ํ๋กํผํฐ์ ์ ๊ทผํ๊ฑฐ๋, ์ธํ ํ ๋ ๊ฐ๊ฐ์ด ์ฌ์ฉ๋๋ค.
const myObject = {
a: 2
}
myObject.a; //2
myObject.a๋ ๋๊ฐ ๋ด๋ ํ๋กํผํฐ ์ ๊ทผ์ด์ง๋ง a๋ ์ด๋ฆ์ ํ๋กํผํฐ๋ฅผ myObject์์ ์ฐพ์ง ์๋๋ค. ๋ช ์ธ์ ๋ฐ๋ฅด๋ฉด ์ด ์ฝ๋๋ myObject์ ๋ํด [[Get]] ์ฐ์ฐ์ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก [[Get]] ์ฐ์ฐ์ ์ฃผ์ด์ง ์ด๋ฆ์ ํ๋กํผํฐ๋ฅผ ๋จผ์ ์ฐพ์๋ณด๊ณ ์์ผ๋ฉด ๊ทธ ๊ฐ์, ์ด๋ป๊ฒ ํด๋ ์ฐพ์ ์ ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํ๋ค.
const myObject = {
a: 2
}
myObject.a = 3;
console.log(myObject.a) //3
์ด๋ myObject์ a๋ ์ด๋ฆ์ ํ๋กํผํฐ์ ๊ฐ์ ์ฌํ ๋นํ๋ [[Set]] ์ฐ์ฐ์ ์คํํ๋ฉด ์ฃผ์ด์ง ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋์ง ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์์์ ๋ฐ๋ผ ์ดํ์ ์๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค. [[Set]] ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฏธ ์กด์ฌํ๋ ํ๋กํผํฐ์ ๋ํด ๋๋ต ๋ค์์ ํ์ธ ์ ์ฐจ๋ฅผ ๋ฐ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํ ํ์ ๊ธฐ๋ฐ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ก์ ๋ค์ํ ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ์ ์ง์ํ๋ค.
์ง๊ธ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ํ ๋ฐฉ์๊ณผ ์์ฑ์ ํจ์๋ค์ ์ํ ๋ฐฉ์๋ง ์ดํด๋ณด๋๋กํ๊ฒ ๋ค.
์ด๋ฌํ ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ค๊ดํธ ๋ด์ 0๊ฐ ์ด์์ ํ๋กํผํฐ๋ฅผ ์ ์ํ๋ค. ๋ณ์์ ํ ๋น๋๋ ์์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํด์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. (๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ค๊ดํธ๋ ์ฝ๋ ๋ธ๋ก์ ์๋ฏธํ์ง ์๋๋ค. ๊ฐ์ผ๋ก ํ๊ฐ๋๋ ํํ์์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ค๊ดํธ์ ๋ง์ง๋ง์๋ ํํ์์ ๋์ ์๋ฆฌ๋ ์ธ๋ฏธ์ฝ๋ก ์ ๋ถ์ธ๋ค.)
const crew = {
name: 'Harry',
greeting: function () {
console.log(`Hello!, I'm ${this.name});
}
}
ํ๋กํผํฐ ๊ฐ์ผ๋ก ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋ณ์๋ช ๊ณผ ํ๋กํผํฐ ํค๊ฐ ๋์ผํ ์ด๋ฆ์ผ ๋ ํ๋กํผํฐ ํค๋ฅผ ์๋ต(property shorthand)ํ ์ ์๋ค. ์ด ๋ ํ๋กํผํฐ ํค๋ ๋ณ์ ์ด๋ฆ์ผ๋ก ์๋ ์์ฑ๋๋ค.
๋ฌธ์์ด ๋๋ ๋ฌธ์์ด๋ก ํ์
๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ ํํ์์ ์ฌ์ฉํด ํ๋กํผํฐ ํค๋ฅผ ๋์ ์ผ๋ก ์์ฑํ ์๋ ์๋ค. ๋จ, ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ ํํ์ค์ ๋๊ดํธ([...])๋ก ๋ฌถ์ด์ผํ๋ค.
์ด๋ฅผ ๊ณ์ฐ๋ ํ๋กํผํฐ ์ด๋ฆ(computed property name)์ด๋ผ ํ๋ค.
(ES5์์๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ธ๋ถ์์๋ง ๊ณ์ฐ๋ ํ๋กํผํฐ ์ด๋ฆ์ผ๋ก ํ๋กํผํฐ ํค๋ฅผ ๋์ ์์ฑํ ์ ์๋ค.)
const prefix = 'prop'
let i = 0;
const obj = {
[`${prefix}-${++i}`]: i, // prop-1: 1
[`${prefix}-${++i}`]: i, // prop-2: 2
[`${prefix}-${++i}`]: i // prop-3: 3
}
//ES5
var obj = {
myFunc: function() {
console.log('Hello, World!');
}
}
//ES6
const obj = {
myFunc() {
console.log('Hello, World!');
}
}
๋ฉ์๋ ์ถ์ฝ ํํ์ผ๋ก ์ ์ํ ๋ฉ์๋๋ ํ๋กํผํฐ์ ํ ๋น๋ ํจ์์ ๋ค๋ฅด๊ฒ ๋์ํ๋ค.
์์ฑ์ ํจ์(constructor)๋ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ฌ ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๋งํ๋ค. ์์ฑ์ ํจ์๋ฅผ ํตํด ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์์ฑํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ Object ์์ฑ์ ํจ์ ์ธ์๋ String, Number, Function ๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋นํธ์ธ(built-in) ์์ฑ์ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์ : ๋์ผํ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํด์ผํ๋ ๊ฒฝ์ฐ ๋นํจ์จ์
์์ฑ์ ํจ์ ๋ฐฉ์ : ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ
ํ๋ฆฟ(ํด๋์ค)์ฒ๋ผ ์ฌ์ฉ. ๊ตฌ์กฐ๊ฐ ๋์ผํ ํ๋กํผํฐ ์์ฑํ ๋ ํจ์จ์
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ ์๋ฌต์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ ํ ์๋ฌต์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
ํจ์๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ผ๋ฐ ๊ฐ์ฒด(ordinary object)์ ๋์ผํ๊ฒ ๋์ํ ์ ์๋ค. ํจ์ ๊ฐ์ฒด๋ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํจ์๋ ๊ฐ์ฒด์ด์ง๋ง ์ผ๋ฐ ๊ฐ์ฒด์๋ ๋ค๋ฅด๋ค. ํจ์๋ ์ผ๋ฐ ๊ฐ์ฒด์ ๋ค๋ฅด๊ฒ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค
๋ฐ๋ผ์ ํจ์ ๊ฐ์ฒด๋ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ ๋ฌผ๋ก , ํจ์๋ก์ ๋์ํ๊ธฐ ์ํ [[Environment]], [[FormalParameters]] ๋ฑ์ ๋ด๋ถ ์ฌ๋กฏ๊ณผ [[Call]], [[Construct]] ๊ฐ์ ๋ด๋ถ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ๊ฐ์ง๊ณ ์๋ค.
๋ชจ๋ ํจ์ ๊ฐ์ฒด๋ [[Call]]์ ๊ฐ์ง์ง๋ง, ๋ชจ๋ ํจ์๊ฐ [[Construct]]๋ฅผ ๊ฐ์ง์ง ๋ชปํ๋ค.
๋ชจ๋ ํจ์ ๊ฐ์ฒด๋ ์๋๋ฅผ ๋ง์กฑํ๋ค.
callable & constructor || callable & non-constructor
์์ฑ์ ํจ์๊ฐ new ์ฐ์ฐ์ ์์ด ํธ์ถ๋๋ฉด ํจ์ ๋ด๋ถ์ new.target์ ํจ์ ์์ ์ ๊ฐ๋ฆฌํจ๋ค. new ์ฐ์ฐ์ ์์ด ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋ ํจ์ ๋ด๋ถ์ new.target์ undefined์ด๋ค.
์ด๋ฅผ ํตํด new ์ฐ์ฐ์๋ฅผ ํตํด ์์ฑ์ ํจ์๋ก์ ํธ์ถํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ํ์ธํ ์ ์๋ค.
์ฐธ๊ณ ๋ก ๋๋ถ๋ถ์ ๋นํธ์ธ ์์ฑ์ ํจ์๋ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋์๋์ง๋ฅผ ํ์ธํ ํ ์ ์ ํ ๊ฐ์ ๋ฐํํ๋ค. Object์ Function ์์ฑ์ ํจ์๋ new ์ฐ์ฐ์ ์์ด ํธ์ถํด๋ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ ๋์ ๋์ผํ๊ฒ ๋์ํ๋ค.
๋ด๋ถ ์ฌ๋กฏ(internal slot)๊ณผ ๋ด๋ถ ๋ฉ์๋(internal method)๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ธฐ ์ํด ECMAScript ์ฌ์์์ ์ฌ์ฉํ๋ ์์ฌ ํ๋กํผํฐ(pseudo property)์ ์์ฌ ๋ฉ์๋(pseudo method)์ด๋ค. ECMAScript ์ฌ์์ ๋ฑ์ฅํ๋ ์ด์ค ๋๊ดํธ([[...]])๋ก ๊ฐ์ผ ์ด๋ฆ๋ค์ด ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ด๋ค.
๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋งค์๋๋ ECMAScript ์ฌ์์ ์ ์๋ ๋๋ก ๊ตฌํ๋์ด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์ค์ ๋ก ๋์ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ์ธ๋ถ๋ก ๊ณต๊ฐ๋ ํ๋กํผํฐ๋ ์๋๋ค. (ํ๋กํผํฐ๋ ์๋๋ค) ์์น์ ์ผ๋ก ์ง์ ์ ๊ทผ, ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ผ๋, ์ผ๋ถ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ํํ์ฌ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์๋จ์ ์ ๊ณตํ๊ธฐ๋ ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ ์ ์ํ๋ค. value, writable, enumerable, configurable๋ฅผ ๋งํ๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ด๋ฆฌํ๋ ๋ด๋ถ ์ํ ๊ฐ(meta-property)์ธ ๋ด๋ถ ์ฌ๋กฏ [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]์ด๋ค.
๋ฐ๋ผ์ Object.getOwnPropertyDescriptor ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์ ์๋ค. ์ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ(PropertyDescriptor) ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
ํ๋กํผํฐ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ(Data Property)์ ์ ๊ทผ์ ํ๋กํผํฐ(Accessor Property)๋ก ๊ตฌ๋ถ๋๋ค. ES5๋ถํฐ ๋ชจ๋ ํ๋กํผํฐ๋ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ(Property Descriptor)๋ก ํํ๋๋ค.
ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ๋ ํ๋กํผํฐ์ ์ข
๋ฅ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ(Data Property Descript)์ ์ ๊ทผ์ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ (Accessor Property Descriptor)๋ก ๋๋๋ค.
๋ฐ์ดํฐ ํ๋กํผํฐ์ ๋ฐ์ดํฐ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ์๋ 4๊ฐ์ง ๋ด๋ถ ์ฌ๋กฏ์ด ์กด์ฌํ๋ค
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
---|---|---|
[[Value]] | value | ํ๋กํผํฐ ๊ฐ |
[[Writable]] | writable | ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ |
[[Enumerable]] | enumerable | ํ๋กํผํฐ์ ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ |
[[Configurable]] | configurable | ํ๋กํผํฐ ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ |
value
ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ๋๋ ๊ฐ์ด๋ค.
ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด [[Value]]์ ๊ฐ์ ์ฌํ ๋นํ๋ค.
์ด๋ ํ๋กํผํฐ๊ฐ ์์ผ๋ฉด ํ๋กํผํฐ๋ฅผ ๋์ ์์ฑํ๊ณ ์์ฑ๋ ํ๋กํผํฐ์ [[Value]]์ ๊ฐ์ ์ ์ฅํ๋ค.
writable
ํ๋กํผํฐ ๊ฐ์ ์ฐ๊ธฐ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์กฐ์ ํ๋ค
์ฐ๊ธฐ ๊ธ์ง๋ ๊ฐ์ ์์ ํ๋ ค๊ณ ํ๋ฉด ์กฐ์ฉํ ์คํจํ๋ฉฐ, ์๊ฒฉ ๋ชจ๋์์ TypeError๊ฐ ๋ฐ์ํ๋ค.
ES5๋ถํฐ๋ getter/setter๋ฅผ ํตํด ํ๋กํผํฐ ์์ค์์ ์ด๋ฌํ ๊ธฐ๋ณธ ๋ก์ง์ ์ค๋ฒ๋ผ์ด๋ ํ ์ ์๋ค.
getter/setter๋ ๊ฐ๊ฐ ์ค์ ๋ก ๊ฐ์ ๊ฐ์ ธ์ค๋/์ธํ
ํ๋ ๊ฐ์ถฐ์ง ํจ์๋ฅผ ํธ์ถํ๋ ํ๋กํผํฐ๋ค. ์ ๊ทผ์ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ์์๋ ํ๋กํผํฐ์ ๊ฐ, writable, configurable, enumerable ์์ฑ์ด ๋ฌด์๋๋ฉฐ, ๋์ ์ ํ๋กํผํฐ์ ๊ฒ(Get)/์
(Set) ์์ฑ์ด ์ค์ํ๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ ๊ฐ์ฒด์ ํ๋กํผํฐ | ์ค๋ช |
---|---|---|
[[Get]] | get | getter ํจ์ ํธ์ถ |
[[Set]] | set | setter ํจ์ ํธ์ถ |
[[Enumerable]] | enumerable | ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ |
[[Configurable]] | configurable | ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ |
ES5๋ถํฐ๋ ํ๋กํผํฐ/๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ฒ ํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ์์ ๋ถ๋ณ์ฑ(Shallow Immutability)๋ง ์ง์ํ๋ค. ๊ทธ๋ฌ๋, ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ผ์๊น์ง ๊ณ ์ ๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ธ ์ผ์ ๊ฑฐ์ ์๋ค.
๊ฐ์ฒด ์์
writable:false, configurable:false๋ฅผ ๊ฐ์ด ์ฐ๋ฉด ๊ฐ์ฒด ํ๋กํผํฐ๋ฅผ ์์์ฒ๋ผ ์ธ ์ ์๋ค.
๊ฐ์ฒด ํ์ฅ ๊ธ์ง
๊ฐ์ฒด์ ๋๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ์ฐจ๋จํ๊ณ ํ์ฌ ํ๋กํผํฐ๋ ์๋ ๊ทธ๋๋ก ๋๋๊ณ ์ถ์ ๋
Object.preventExtensions()๋ฅผ ํธ์ถํ๋ค.
๊ฐ์ฒด๋ด์ธ
Object.seal()์ ๋ด์ธ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ด๋ค ๊ฐ์ฒด์ ๋ํด Object.preventExtensions()๋ฅผ ์คํํ๊ณ , ํ๋กํผํฐ๋ฅผ ์ ๋ถ configurable:false ์ฒ๋ฆฌํ๋ค.
๊ฐ์ฒด๊ฐ ๊ฐ๋ ๋ชจ๋ ํ๋กํผํฐ์ ๋ํด ์ฌ๊ท์ ์ผ๋ก Object.freeze๋ฅผ ํธ์ถํด ๋ถ๋ณ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ด ํฌ๊ฒ 3๊ฐ์ ๊ฐ์ฒด๋ก ๋ถ๋ฅํ ์ ์๋ค.
ํ์ค ๋นํธ์ธ ๊ฐ์ฒด(standard built-in object / native objects / global object)
ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ ECMASCript ์ฌ์์ ์ ์๋ ๊ฐ์ฒด์ด๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ํ๊ฒฝ (๋ธ๋ผ์ฐ์ ๋๋ Node.js ํ๊ฒฝ)๊ณผ ๊ด๊ณ์์ด ์ธ์ ๋ ์ฌ์ฉํ ์ ์๋ค. ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก์ ์ ๊ณต๋๋ค.
ํธ์คํธ ๊ฐ์ฒด (host object)
ํธ์คํธ ๊ฐ์ฒด๋ ECMAScript ์ฌ์์ ์ ์๋์ด ์์ง ์์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ํ๊ฒฝ์์ ์ถ๊ฐ๋ก ์ ๊ณตํ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ DOM, BOM, Fetch ๋ฑ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ API๋ฅผ ํธ์คํธ ๊ฐ์ฒด๋ก ์ ๊ณตํ๊ณ Node.js ํ๊ฒฝ์์๋ Node.js ๊ณ ์ ์ API๋ฅผ ํธ์คํธ ๊ฐ์ฒด๋ก ์ ๊ณตํ๋ค.
์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด (user-defined object)
์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
(์ด์ธ์๋ ์ค์ํ ๋ด์ฉ์ด ๋ง์ผ๋ฉฐ ํ๋กํ ํ์ , ํด๋์ค, ํจ์ ๋ฑ์ ๊ธ์์ ๋ ๋ค๋ฃฐ ์์ ์ด๋ค.)
๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
YOU DONโT KNOW JS
ECMAScriptยฎ 2022 Languageย Specification