** ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ DeepDive 16์ฅ์ ์ฝ์ผ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ดํ ๋ด์ฉ์ ๋ค๋ฃฌ๋ค. ์ด๋ ๊ฐ๋จํ๊ฒ ๊ฐ์ฒด ์์ฑ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋ ๊ธฐ๋ณธ์ ์ธ ์ํ ๋ฐ ์์ฑ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํด์ ์๊ธฐ ์ํด์๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ๋ํด ๋จผ์ ์ดํดํด์ผ ํ๋ค. ๊ฐ๋จํ ๋๋ต์ ์ธ ๊ฐ๋ ๋ง ์ดํดํ๊ณ ๋์ด๊ฐ๋ฉด ๋๋ค.
๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ js ์์ง์ ๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช
ํ๊ธฐ ์ํด ECMAScript ์ฌ์์์ ์ฌ์ฉํ๋ ์์ฌ ํ๋กํผํฐ์ ์์ฌ ๋ฉ์๋
๋ค.
( ์ฝ๊ฒ ๋ด๋ถ ๋ก์ง์ ์์ฑํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์. )
๋ด๋ถ ์ฌ๋กฏ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ์ธ๋ถ๋ก ๊ณต๊ฐ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ฉฐ, ์ผ๋ถ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋์ ์ ๊ทผํ ์ ์๋ ์๋จ์ ์ ๊ณตํ๋ค.
- ex. [[prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๊ฒฝ์ฐ __proto__
๋ฅผ ํตํด ๊ฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. o.proto
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ๋๋ค.
์ํ์๋ ํ๋กํผํฐ์ ๊ฐ(value), ๊ฐ์ ๊ฐฑ์ ์ฌ๋ถ(writable), ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ(enumerable), ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ(configurable)๊ฐ ์๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ์ง์ ์ ๊ทผํ ์ ์์ง๋ง Object.getOwnPropertyDescriptor
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
- ex. console.log(Object.getOwnPropertyDescriptor(๊ฐ์ฒด์ ์ฐธ์กฐ,โํ๋กํผํฐ ํคโ);
๋ฐํ : ํ๋กํผํฐ ๋์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
(์กด์ฌํ์ง ์๋ ํ๋กํผํฐ๋ ์์๋ฐ์ ํ๋กํผํฐ์ ๋ํ ๋์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์๊ตฌ์ undefined๋ฅผ ๋ฐํ)
ํ๋กํผํฐ๋ ๋ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค. ๋ฐ์ดํฐ ํ๋กํผํฐ
์ ์ ๊ทผ์ ํ๋กํผํฐ
์ด๋ค.
ํค์ ๊ฐ
์ผ๋ก ๊ตฌ์ฑ๋ ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ์ด๋ค. (๋๋ถ๋ถ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ํด๋นํ๋ค. )
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ์ค๋ช |
---|---|
[[ Value ]] | ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ๋๋ ๊ฐ์ด๋ค. ๊ฐ์ ๋ณ๊ฒฝ์ [[ value]]์ ๊ฐ์ ์ฌํ ๋นํ๋ค. ํ๋กํผํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ํ๋กํผํฐ๋ฅผ ๋์ ์์ฑํ๊ณ ์์ฑ๋ ํ๋กํผํฐ์ ๊ฐ์ [[ value ]]์ ์ ์ฅํ๋ค. |
[[ Writable ]] | ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ๋๋ค. ๊ฐ์ด false์ธ ๊ฒฝ์ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ์ฝ๊ธฐ์ ์ฉ ํ๋กํผํฐ๊ฐ ๋๋ค. |
[[ Enumerable ]] | ํ๋กํผํฐ์ ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ๋๋ค. ์ด๊ฑฐ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ๋ for-in ๋ฐ๋ณต๋ฌธ์ด๋ Object.keys() ๋ฑ์ ๋ฐ๋ณต์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค. |
[[ Configurable ]] | ํ๋กํผํฐ์ ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ๊ฐ์ ๊ฐ๋๋ค. false์ธ ๊ฒฝ์ฐ ํด๋น ํ๋กํผํฐ์ ์ญ์ ๋ฐ ๊ฐ์ ๋ณ๊ฒฝ์ด ๊ธ์ง๋๋ค. |
ํ๋กํผํฐ ์์ฑ์ [[ Value ]] ์ ๊ฐ์ ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ฉฐ, ๋๋จธ์ง ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ true๋ก ์ด๊ธฐํ๋๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ | ์ค๋ช |
---|---|
[[ Get ]] | ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ์ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์์ด๋ค. ์ฆ [[ Get ]]์ ๊ฐ getter ํจ์๊ฐ ํธ์ถ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋กํผํฐ ๊ฐ์ผ๋ก ๋ฐํ๋๋ค. |
[[ Set ]] | ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก [[ Set ]]์ ๊ฐ setter ํจ์๊ฐ ํธ์ถ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ ์ฅ๋๋ค. |
[[ Enumerable ]] | ๋ฐ์ดํฐ ํ๋กํผํฐ์ [[ Enumerable ]] ๊ณผ ๋์ผ |
[[ Configurable ]] | ๋ฐ์ดํฐ ํ๋กํผํฐ์ [[ Configurable ]] ๊ณผ ๋์ผ |
const person = {
// ๋ฐ์ดํฐ ํ๋กํผํฐ
firstName:'Ungmo',
lastName: 'Lee'
}
// fullName์ ์ ๊ทผ์ ํจ์๋ก ๊ตฌ์ฑ๋ ์ ๊ทผ์ ํ๋กํผํฐ์ด๋ค.
// getter ํจ์
**get** fullName(){
return `${this.firstName} ${this.lastName}`;
},
// setter ํจ์
**set** fullName(name){
[this.firstName, this.lastName] = name.split('');
}
// ๋ฐ์ดํฐ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ฐธ์กฐ
console.log(person.firstName + ' '+ person.lastName);
// ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ ์ฅ
// ์ ๊ทผ์ ํ๋กํผํฐ fullName์ ๊ฐ์ ์ ์ฅํ๋ฉด setter ํจ์๊ฐ ํธ์ถ๋๋ค.
person.fullName = 'Heegun Lee';
console.log(person);
// ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํ ํ๋กํผํฐ ๊ฐ์ ์ฑ์กฐ
// ์ ๊ทผ์ ํ๋กํผํฐ fullName์ ์ ๊ทผํ๋ฉด getter ํจ์๊ฐ ํธ์ถ๋๋ค.
console.log(person.fullName);
// firstName์ ๋ฐ์ดํฐ ํ๋กํผํฐ๋ค.
let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName')
console.log(descriptor);
// {value: 'Heegun', writable: true, enumerate:true, configurable:true
// fullName์ ์ ๊ทผ์ ํ๋กํผํฐ์ด๋ค.
descriptor = Object.getOwnPropertyDescriptor(person, 'fullName');
console.log(descriptor);
//{get:f, set:f, enumerable: true, configurable: true}
```jsx
Object.getOwnPropertyDescriptor(Object.prototype, '__proto__');
//{get:f, set:f, enumerable: true, configurable: true}
```
- ํจ์ ๊ฐ์ฒด์ prototype์ ๋ฐ์ดํฐ ํ๋กํผํฐ์ด๋ค.
```jsx
Object.getOwnPropertyDescriptor(function(){}, 'prototype')l
// {value: '...', writable: true, enumerate:true, configurable:true
```
Object.defineProperty
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ํ ์ ์๋ค. ์ฆ, ํ๋กํผํฐ ๊ฐ์ ๊ฐฑ์ ํ ์ ์๋๋ก ํ ๊ฒ์ธ์ง, ์ด๊ฑฐ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง, ์ฌ์ ์ ๊ฐ๋ฅํ๋๋ก ํ ๊ฒ์ธ์ง์ ์ฌ๋ถ๋ฅผ ๋ช ํํ ์ ์ํ ์ ์๋ค.
Object.defineProperty
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋๋ฝ์ํค๋ฉด( ๊ฐ์ฒด์ ํค, ๊ฐ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ) undefined, false๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๋ค.Object.defineProperties
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ํ๋กํผํฐ๋ฅผ ํ ๋ฒ์ ์ ์ํ ์ ์๋ค.const person = {}
// ๋ฐ์ดํฐ ํ๋กํผํฐ ์ ์
Object.defineProperty(person, 'firstName',{
value:'Ungmo',
writable:true,
enumeratable:true,
configurable:true
})
๊ฐ์ฒด๋ ๋ณ๊ฒฝ๊ฐ๋ฅํ ๊ฐ์ด๋ฏ๋ก ์ฌํ ๋น ์์ด ์ง์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. ์ฆ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ ํ๋กํผํฐ ๊ฐ์ ๊ฐฑ์ ํ ์ ์์ผ๋ฉฐ, Object.defineProperty
๋ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ ์ ํ ์ ์๋ค.
๊ตฌ๋ถ | ๋ฉ์๋ | ํ๋กํผํฐ ๊ฐ ์ฝ๊ธฐ | ํ๋กํผํฐ ์ถ๊ฐ | ํ๋กํผํฐ ์ญ์ | ํ๋กํผํฐ ๊ฐ ์ฐ๊ธฐ | ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ |
---|---|---|---|---|---|---|
๊ฐ์ฒด ํ์ฅ ๊ธ์ง | Object.preventExtensions | O | X | O | O | O |
๊ฐ์ฒด ๋ฐ๋ด | Object.seal | O | X | X | O | X |
๊ฐ์ฒด ๋๊ฒฐ | Object.freeze | O | X | X | X | X |
ObjectExtensible
๋ฉ์๋๋ก ๊ฐ์ฒด ํ์ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.isSealed
๋ฉ์๋๋ก ํ์ธ ๊ฐ๋ฅํ๋ค.isFrozen
๋ฉ์๋๋ก ํ์ธ ๊ฐ๋ฅํ๋ค.๊ฐ์ฒด ์๋ฃํ์ ์์ฃผ ์ฌ์ฉํจ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ ํ๋ก๊ทธ๋จ ๋์ค์ ์๋์น ์๊ฒ ์์ ์ด๋ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ๊ฐ์ฒด์ ํจ๋ถ๋ก ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํ๊ธฐ ์ํด์ ๊ฐ์ฒด์ ์ปจํธ๋กค์ด ํ์ํ๋ค.
์ฆ, ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ ํ์ฑ ๋ฐ ๋ฌด๊ฒฐ์ฑ์ ๋ํ ๊ด๋ฆฌ๋ฅผ ์์ฝ๊ฒ ํ ์ ์๋ค๊ณ ์๊ฐํด๋ณด์๋ค.