Chapter16 ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ
๋ค์ ๋ฌธ์ฅ์ true or false๋ฅผ ํ๋จํ์ธ์.
(1) ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ๋ ์์๋ฐ์ ํ๋กํผํฐ์ ๋ํ ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์๊ตฌํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
(2) ์ ๊ทผ์ ํ๋กํผํฐ๋ ์์ฒด์ ์ผ๋ก ๊ฐ(ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ [[Value]])์ ๊ฐ์ง๋ค.
(3) [[Configurable]]์ ๊ฐ์ด false์ธ ๊ฒฝ์ฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์๋ฌ ์์ด ๋ฌด์ํ๋ค.
(1) false
(2) false
(3) true
(1) 221p
undefined๋ฅผ ๋ฐํํ๋ค.
(2) 225p
์ ๊ทผ์ ํ๋กํผํฐ๋ ์์ฒด์ ์ผ๋ก ๊ฐ์ ๊ฐ์ง์ง ์์ผ๋ฉฐ, ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ๊ด์ฌํ๋ค.
(3) 227p
[[Configurable]]์ ๊ฐ์ด false์ธ ๊ฒฝ์ฐ์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ด๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์๋ฌ๋ ๋ฐ์ํ์ง ์๊ณ ๋ฌด์๋๋ค.
๋ค์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ์ธ์.
const person = { name : "Jing" } ;
Object . freeze ( person ) ;
console . log ( Object . getOwnPropertyDescriptors ( person ) ) ; // (1)
person . age = 23 ;
console . log ( person ) ; // (2)
delete person . name ;
console . log ( person ) ; // (3)
person . name = "JiEun" ;
console . log ( person ) ; // (4)
Object . defineProperty ( person , "name" , { configurable : true } ) ; // (5)
(1)
{
name: {
value: 'Jing',
writable: false,
enumerable: true,
configurable: false
}
}
(2) { name: 'Jing' }
(3) { name: 'Jing' }
(4) { name: 'Jing' }
(5) TypeError: Cannot redefine property: name
231p
(1) freeze๋ ๊ฐ์ฒด๋ writable๊ณผ configurable์ด false์ด๋ค.
(2), (3), (4)
ํ๋กํผํฐ ์ถ๊ฐ, ์ญ์ , ๊ฐฑ์ ์ ๊ธ์ง๋๋ฉฐ, ์ํ์ ๋ฌด์๋๋ค.
๋จ, strict mode์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
(5)ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์๊ฐ ๊ธ์ง๋๋ค.
๋ค์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์์ค
const obj = {
a : 1 ,
b : {
c : 2
}
}
Object . freeze ( obj ) ;
const descriptor = Object . getOwnPropertyDescriptor ( obj , b ) ;
console . log ( descriptor ) ;
obj . a = 2 ;
obj . b . c = 3 ;
console . log ( obj ) ;
{value: {c: 3}, writable: false, enumerable: true, configurable: false}
{a: 1, b: {c: 3}
obj.b์ ๊ฐ์ freeze ๋์ด์๊ธฐ ๋๋ฌธ์ writable, configurable ํ ์ ์๋ค. (๋ณ๊ฒฝํ๊ฑฐ๋ ์ฌ์ ์ํ ์ ์๋ค).
ํ์ง๋ง ์ค์ฒฉ ๊ฐ์ฒด์ผ ์์๋ ๋ณ๊ฒฝ์ ๋ง์ ์ ์๋ค. ๋ฐ๋ผ์ obj.b.c์ ๊ฐ์ ๋ณ๊ฒฝ๋๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ ์ธ๋ฐฉ์(1)๊ณผ defineProperty๋ฐฉ์(2)์ผ๋ก ์ ์ธํ์๋ ์ดํธ๋ฆฌ๋ทฐํธ(writable, enumerable,configurable) ์ ์์ ์ฐจ์ด์ ์ด ๋ฌด์์ธ์ง ์์ฑํ์์ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์์ผ๋ก ์ ์ํ๊ฒ๋๋ฉด ์ ๋ถ true๋ก ์ ์๋๊ณ , defineProperty๋ฐฉ์์ผ๋ก ์ ์ธํ๊ฒ๋๋ฉด ์ ๋ถ false๋ก ์ ์๋๋ค.
์ถ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ์ธ์
const obj = { } ;
Object . defineProperties ( obj , {
firstName : {
value : "deep" ,
writable : true ,
enumerable : true ,
configurable : false ,
} ,
lastName : {
value : "dive" ,
writable : true ,
enumerable : true ,
configurable : false ,
} ,
} ) ;
Object . defineProperties ( obj , {
firstName : {
writable : false ,
} ,
} ) ;
console . log ( Object . getOwnPropertyDescriptors ( obj ) ) ; // (1)
Object . defineProperties ( obj , {
lastName : {
writable : false ,
enumerable : false ,
} ,
} ) ;
console . log ( Object . getOwnPropertyDescriptors ( obj ) ) ; // (2)
1.
{
firstName : {
value : "deep" ,
writable : false ,
enumerable : true ,
configurable : false ,
} ,
lastName : {
value : "dive" ,
writable : true
enumerable : true ,
configurable : false ,
}
}
configurable์์ฑ์ด false๋ผ๋ , writable๊ฐ์ true - > false๋ก ๋ณ๊ฒฝ์ ๊ฐ๋ฅํ๋ค .
2.
์๋ฌ๋ฐ์ -> TypeError: Cannot redefine property: lastName at Function.defineProperties
configurable์์ฑ์ด false๋ก ์ ์๋์ด์๊ธฐ๋๋ฌธ์ enumerable์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋ค.
ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ์ ์ข
๋ฅ๋ก Value
, Writable
, Enumerable
, Configurable
, Get
, Set
์ด ์์ต๋๋ค. ๊ฐ๊ฐ์ ๋ํด ๊ฐ๋จํ ์ค๋ช
ํ์์ค.
Value : ํ๋กํผํฐ ํค๋ฅผ ํตํด ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ฉด ๋ฐํ๋๋ ๊ฐ
Writable : ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ๋๋ค.
Enumerable : ํ๋กํผํฐ์ ์ด๊ฑฐ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ๋๋ค.
Configurable : ํ๋กํผํฐ์ ์ฌ์ ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ฉฐ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฐ๋๋ค.
Get : ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ์ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์๋ค.
Set : ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋กํผํฐ์ ๊ฐ์ ์ ์ฅํ ๋ ํธ์ถ๋๋ ์ ๊ทผ์ ํจ์๋ค.