Language/JavaScript

[JS] ๐Ÿ“š Object ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ ์ข…๋ฅ˜ ๐Ÿ’ฏ ์ •๋ฆฌ

์ธํŒŒ_ 2021. 9. 25. 14:39

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ-Object-๋ฉ”์†Œ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ

โ€‹๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋Š” Object ๊ฐ์ฒด์™€ Object.prototype ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

Object.create()

์ฃผ์–ด์ง„ ํ”„๋กœํ† ํƒ€์ž…(prototype)์˜ ๊ฐ์ฒด์™€ ์†์„ฑ๋“ค์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Object.assign()

ํ•˜๋‚˜ ์ด์ƒ์˜ ์›๋ณธ ๊ฐ์ฒด๋“ค๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ์—ด๊ฑฐ๊ฐ€๋Šฅํ•œ ์†์„ฑ๋“ค์„ ๋Œ€์ƒ ๊ฐ์ฒด๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

var user ={
  name : "mike",
  age : 30
}

var cloneUser = user; // ๊ฐ์ฒด์ฃผ์†Œ ์ฐธ์กฐ๊ฐ’์ด ๋ณต์‚ฌ๋œ๋‹ค. -> ์„œ๋กœ ๊ณต์œ ํ•œ๋‹ค. ์ง„์ •ํ•œ ๋ณต์‚ฌ X


var cloneUser2 = Object.assign({}, user); // ๋นˆ๊ฐ์ฒด๋Š” ์ดˆ๊นƒ๊ฐ’, ๋‚ด์šฉ์„ ๊ณ ๋Œ€๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
var cloneUser3 = Object.assign({gender : 'male'}, user); // gender๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๊ฐ์ฒด๊ฐ’์„ ์–ป๋Š”๋‹ค.
//  { gender:'male', name : "mike", age : 30 }
var cloneUser4 = Object.assign({name : "Tom"}, user);  // ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ๋ฉด ๋ฎ์–ด์”Œ์›Œ์ง„๋‹ค.


const user = { name : "Mike" }
const age_info = { age : 30 }
const gender_info = { gender : "male" }
var cloneUser5 = Object.assign(user, age_info, gender_info); // ๊ฐ์ฒด ๋ณ€์ˆ˜๋ฅผ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค.

โ€‹

Object.keys()

๊ฐ์ฒด์˜ ํ‚ค๋งŒ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Object.values()

๊ฐ์ฒด์˜ ๊ฐ’๋งŒ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Object.entries()

[ํ‚ค, ๊ฐ’] ์Œ์„ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ณดํ†ต ๊ฐ์ฒด๋ฅผ ์ด์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Map์ž๋ฃŒํ˜•์œผ๋กœ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉ

const user = {
  name : "Mike",
  age : 30,
  gender : "male"
}

Object.entries(user); // [ ["name", "Mike"], ["age", 30], ["gender", "male"] ]

โ€‹

Object.fromEntries()

[ํ‚ค, ๊ฐ’] ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์„ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Object.is()

๋‘ ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  NaN ๊ฐ’์€ ๊ฐ™๋‹ค๊ณ  ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค

var test = { a: 1 };
Object.is(test, test);       // true

Object.is(null, null);       // true
Object.is([], []);           // false
Object.is(0, -0);            // false
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

โ€‹

Object.freeze() / Object.isFrozen()

๊ฐ์ฒด๋ฅผ ํ”„๋ฆฌ์ง•(freeze)ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๊ณณ์˜ ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ง€์šฐ๊ฑฐ๋‚˜ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

/ ๊ฐ์ฒด๊ฐ€ ํ”„๋ฆฌ์ง• ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Object.seal() / Object.isSealed()

๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์‚ญ์ œํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

/ ๊ฐ์ฒด๊ฐ€ ์‹ค๋ง(seal) ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Object.getPrototypeOf()

๋ช…์‹œ๋œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๋ฐ˜ํ™˜.

โ€‹

Object.setPrototypeOf()

ํ”„๋กœํ† ํƒ€์ž…(์ฆ‰, ๋‚ด๋ถ€์˜ [[Prototype]] ์†์„ฑ)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Instanceof

ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด์ธ์ง€ ๋น„๊ตํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด๊ฐ€ ํŠน์ • ์ƒ์„ฑ์ž์˜ ์ž์‹์ธ์ง€ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// Object๊ฐ์ฒด๋ž‘ ๋น„๊ตํ•ด์„œ ๊ฐ์ฒด ํ™•์ธ
child instanceof Object; // true

// ๊ฐ์ฒด ์ƒ์† ํ™•์ธ
child instanceof Parent; // true
child instanceof GrandParent; // true
typeof 5; // return 'number' 
typeof 'haha'; // return 'string' 
typeof {}; // return 'object' 
typeof []; // return 'object' 
typeof function () {}; // return 'function' 
typeof null; // return 'object'

 

delete

๊ฐ์ฒด ๋‚ด์˜ ์†์„ฑ์„ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ ์‹คํŒจํ•˜๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

configurable์ด false๊ฑฐ๋‚˜ freeze๋œ ์ƒํƒœ๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

var obj = {
  a: 'hi',
  b: 'zero',
};

obj.b; // zero
delete obj.b;
obj.b; // undefined

โ€‹

hasOwnProperty()

ํŠน์ • ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด์— ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ฐ์ฒด์—์„œ ์ง์ ‘ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋งŒ์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ, ๊ฐ™์€ ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ๋ผ๋„ ์ƒ์†๋ฐ›์€ ํ”„๋กœํผํ‹ฐ๋Š” false ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

var obj = {
  example: 'yes',
};
obj.example; // yes
obj.hasOwnProperty('example'); // true
obj.toString; // function toString() { [native code] }
obj.hasOwnProperty('toString'); // false

โ€‹

propertyIsEnumerable()

ํŠน์ • ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด์— ์กด์žฌํ•˜๊ณ , ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด ๋ฉ”์†Œ๋“œ๋Š” hasOwnProperty() ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด์„œ, ๋™์‹œ์— ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์—ด๊ฑฐ ๊ฐ€๋Šฅ์ด๋ž€ for ... in๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ƒ์†๋ฐ›์€ ์†์„ฑ๊ณผ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์†์„ฑ์ด ์•„๋‹Œ ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

function Dog(color, name, age) {
  this.color = color;
  this.name = name;
  this.age = age;
}

var myDog = new Dog("ํฐ์ƒ‰", "๋งˆ๋ฃจ", 1);
// color ํ”„๋กœํผํ‹ฐ์˜ enumerable ์†์„ฑ์„ false๋กœ ์„ค์ •ํ•จ.
Object.defineProperty(myDog, 'color', { enumerable : false} );

document.write(myDog.propertyIsEnumerable("color") + "<br>"); // false
document.write(myDog.propertyIsEnumerable("name") + "<br>"); // true
document.write(myDog.propertyIsEnumerable("age")); // true

โ€‹

isPrototypeOf()

ํŠน์ • ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ํ˜„์žฌ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด๊ฐ€ ๋Œ€์ƒ์˜ ์กฐ์ƒ์ธ์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

var GrandParent = function() { };

var Parent = function() { };
Parent.prototype = new GrandParent();
Parent.prototype.constructor = Parent;

var Child = function() { };
Child.prototype = new Parent();
Child.prototype.constructor = Child;

var child = new Child();
Parent.prototype.isPrototypeOf(child); // true
GrandParent.prototype.isPrototypeOf(child); // true

โ€‹

isExtensible() / Object.preventExtensions()

๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Object.preventExtensions() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var day = new Date(); // Date ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ.

// ๊ฐ์ฒด day์— ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•จ.
document.write(Object.isExtensible(day) + "<br>"); // true

// ํ•ด๋‹น ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋„๋ก ์„ค์ •ํ•จ.
var myDay = Object.preventExtensions(day);

document.write(Object.isExtensible(day)); // false

โ€‹

toString() ๋ฉ”์†Œ๋“œ

์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

var arr = [10, "๋ฌธ์ž์—ด", true]; // ๋ฐฐ์—ด
var bool = false; // ๋ถˆ๋ฆฌ์–ธ
function func() { return 0; } // ํ•จ์ˆ˜
arr.toString(); // 10,๋ฌธ์ž์—ด,true
bool.toString(); // false
func.toString(); // ํ•จ์ˆ˜์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ „๋ถ€ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜๋จ.
โ€‹toString() ๋ฉ”์†Œ๋“œ๋Š” ์–ด๋– ํ•œ ์ธ์ˆ˜๋„ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

valueOf() ๋ฉ”์†Œ๋“œ

ํŠน์ • ๊ฐ์ฒด์˜ ์›์‹œ ํƒ€์ž…(primitive type)์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์›์‹œ ํƒ€์ž…์˜ ๊ฐ’์ด ๊ธฐ๋Œ€๋˜๋Š” ๊ณณ์— ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด, ๋‚ด๋ถ€์ ์œผ๋กœ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์›์‹œ ํƒ€์ž…์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์ด ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

function func(n) {
  this.number = n;
}

myFunc = new func(4);
document.write(myFunc + 5); // โ‘  : [object Object]5

func.prototype.valueOf = function() { // valueOf() ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•จ.
  return this.number;
}

document.write(myFunc + 5); // โ‘ก : 9

์œ„์˜ ์˜ˆ์ œ โ‘  ๋ถ€๋ถ„์—์„œ๋Š” ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์œ„ํ•ด number ํƒ€์ž…์˜ ๊ฐ’์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ณณ์— myFunc ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด์˜ valueOf() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๊ฐ์ฒด์˜ valueOf() ๋ฉ”์†Œ๋“œ๋Š” ์•„์ง ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ํ•ด๋‹น ๊ฐ์ฒด ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ด ์•„๋‹Œ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ ํ›„์— ์˜ˆ์ œ์—์„œ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ valueOf() ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ โ‘ก ๋ถ€๋ถ„์—์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœ๋œ valueOf() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด์˜ number ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ •์ƒ์ ์œผ๋กœ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

โ€‹

Object.defineProperty() / Object.defineProperties()

๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ž์„ธํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ์˜ ์„ค๋ช…์„ ๋”ฐ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,

  • โ€‹writable์€ ์†์„ฑ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š”์ง€,
  • enumerable์€ for ... in ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€,
  • configurable์€ ์†์„ฑ์˜ ์„ค๋ช…์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. false์ธ ๊ฒฝ์šฐ delete ๋™์ž‘๋„ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โ€‹๊ธฐ๋ณธ์ ์œผ๋กœ writable, enumerable, configurable์€ false์ž…๋‹ˆ๋‹ค.

value๋Š” ์†์„ฑ์˜ ๊ฐ’, get์€ ์†์„ฑ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ, set์€ ์†์„ฑ์˜ ๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

[JS] ๐Ÿ“š getter & setter ๋ž€?

ํ”„๋กœํผํ‹ฐ getter์™€ setter ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋Š” ๋‘ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ข…๋ฅ˜๋Š” ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ(data property) ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ ‘๊ทผ

inpa.tistory.com

var obj = {};

Object.defineProperties(obj, { // ๊ฐ์ฒด ๋ณต์ˆ˜ ์ •์˜
  a: {
    value: 5, // a: 5 ๋กœ ์„ค์ •
    writable: false, // ์“ฐ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ
    enumerable: true, // ์ˆœํšŒ ๊ฐ€๋Šฅ
  },
  b: {
    get: function() { // defineProperties์•ˆ์— get์„ ์“ฐ๋ฉด getter๋กœ ๋™์ž‘
      return 'zero';
    },
    set: function(value) { // defineProperties์•ˆ์— set์„ ์“ฐ๋ฉด setter๋กœ ๋™์ž‘
      console.log(this, value);
      this.a = value;
    },
    enumerable: false,
    configurable: false,
  },
});

obj.a; // 5
obj.b; // 'zero'
obj.a = 10;
obj.a; // writable์ด false๋ผ ๊ทธ๋Œ€๋กœ 5
for (var key in obj) {
  console.log(key); // b์˜ enumerable์ด false์ด๋‹ˆ๊นŒ a๋งŒ log๋จ
}

obj.b = 15; // 15๋กœ ์„ค์ •๋˜๋Š” ๋Œ€์‹  set์˜ ๋‚ด์šฉ์ด ์‹คํ–‰๋จ. set์˜ value๋Š” 15
obj.a; // this.a = value๋กœ ์ธํ•ด 15๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๋‚˜ writable์ด false๋ผ ๋ฌด์‹œ๋จ
obj.b; // ๊ทธ๋Œ€๋กœ 'zero'
Object.defineProperty(obj, 'b', {
  value: 5
}); // Uncaught TypeError: Cannot redefine property: b
Object.defineProperty(obj, 'b', { enumerable : true} ); // b์˜ ์ˆœํšŒ๊ฐ€๋Šฅํ•จ์„ true๋กœ

โ€‹

Object.getOwnPropertyDescriptor()

๊ฐ์ฒด์˜ ์ด๋ฆ„๋ถ™์€ ์†์„ฑ์˜ ๊ธฐ์ˆ ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Object.getOwnPropertyDescriptor(obj, 'b'); 
// { enumerable: false, configurable: false, get: function() {}, set: function(value) {} }

โ€‹

Object.getOwnPropertyNames()

์—ด๊ฑฐ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์—ด๊ฑฐ๋ถˆ๊ฐ€๋Šฅํ•œ ์†์„ฑ๋“ค, ์ฆ‰ ๋ชจ๋“  ์†์„ฑ๋“ค์˜ ์ด๋ฆ„์„ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด(array)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

let obj = {
    a: 1,
    b: 2,
    c: 3
}

Object.defineProperty(obj, 'b', { enumerable: false }); // b์†์„ฑ์„ ์ˆœํšŒ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •

console.log(Object.keys(obj)); // ['a', 'c']
console.log(Object.getOwnPropertyNames(obj)); // ['a', 'b', 'c']

โ€‹

Object.getOwnPropertySymbols() (en-US)

์ฃผ์–ด์ง„ ๊ฐ์ฒด์—์„œ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์‹ฌ๋ณผ ์†์„ฑ์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.