[JS] ๐ 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์ ์์ฑ์ ๊ฐ์ ์ค์ ํ ๋๋ฅผ ์๋ฏธํฉ๋๋ค.
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)
์ฃผ์ด์ง ๊ฐ์ฒด์์ ๋ฐ๋ก ์ฐพ์ ์ ์๋ ๋ชจ๋ ์ฌ๋ณผ ์์ฑ์ ๋ฐฐ์ด๋ก ๋ฐํํฉ๋๋ค.