Skip to content

Latest commit

ย 

History

History
190 lines (162 loc) ยท 4.75 KB

ch16-ํ•ด์„ค.md

File metadata and controls

190 lines (162 loc) ยท 4.75 KB

Chapter16 ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

๐Ÿ“Œ๋ฌธ์ œ1

๋‹ค์Œ ๋ฌธ์žฅ์˜ true or false๋ฅผ ํŒ๋‹จํ•˜์„ธ์š”.

(1) ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ์ƒ์†๋ฐ›์€ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์š”๊ตฌํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
(2) ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ฐ’(ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Value]])์„ ๊ฐ€์ง„๋‹ค.
(3) [[Configurable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์—๋Ÿฌ ์—†์ด ๋ฌด์‹œํ•œ๋‹ค.

์ •๋‹ต ๋ฐ ํ•ด์„ค

(1) false
(2) false
(3) true
(1) 221p
undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

(2) 225p
์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋•Œ ๊ด€์—ฌํ•œ๋‹ค.

(3) 227p
[[Configurable]]์˜ ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
์ด๋•Œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋ฌด์‹œ๋œ๋‹ค.

๐Ÿ“Œ๋ฌธ์ œ2

๋‹ค์Œ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜์„ธ์š”.

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)ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์žฌ์ •์˜๊ฐ€ ๊ธˆ์ง€๋œ๋‹ค.

๐Ÿ“Œ๋ฌธ์ œ3

๋‹ค์Œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์“ฐ์‹œ์˜ค

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์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋œ๋‹ค.

๐Ÿ“Œ๋ฌธ์ œ4

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์„ ์–ธ๋ฐฉ์‹(1)๊ณผ defineProperty๋ฐฉ์‹(2)์œผ๋กœ ์„ ์–ธํ–ˆ์„๋–„ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ(writable, enumerable,configurable) ์ •์˜์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ •๋‹ต ๋ฐ ํ•ด์„ค

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•˜๊ฒŒ๋˜๋ฉด ์ „๋ถ€ true๋กœ ์ •์˜๋˜๊ณ , defineProperty๋ฐฉ์‹์œผ๋กœ ์„ ์–ธํ•˜๊ฒŒ๋˜๋ฉด ์ „๋ถ€ false๋กœ ์ •์˜๋œ๋‹ค.

๐Ÿ“Œ๋ฌธ์ œ5

์ถœ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜์„ธ์š”

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์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

๐Ÿ“Œ๋ฌธ์ œ6

ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์ข…๋ฅ˜๋กœ Value, Writable, Enumerable, Configurable, Get, Set์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์‹œ์˜ค.

์ •๋‹ต ๋ฐ ํ•ด์„ค

Value : ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’
Writable : ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.
Enumerable : ํ”„๋กœํผํ‹ฐ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.
Configurable : ํ”„๋กœํผํ‹ฐ์˜ ์žฌ์ •์˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.
Get : ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋‹ค.
Set : ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋‹ค.