자바스크립트 내장 객체인 Object는 이전까지 배운 자바스크립트 객체들의 원형이다.
일반 객체인 Object에는 다음과 같은 정적 메서드들을 사용할 수 있다.
Object.keys(obj)
- 객체의 키만 담은 배열을 반환한다.
Object.values(obj)
- 객체의 값만 담은 배열을 반환한다.
Object.entries(obj)
- [키, 값] 쌍을 담은 배열을 반환한다.
let user = {
name: "John",
age: 30
};
// Object.keys(obj) = [”name”, “age”]
// Object.values(obj) = [”John”, 30]
// Object.entries(obj) = [ [”name”, “John”], [”age”, 30] ]
배열을 반환하는 특징이 있으므로 이전에 배운 배열 메서드를 적용할 수 있다.
const obj = {
kim: 1,
apple: 2,
banana: 3
};
console.log(
Object
.keys(obj)
.sort()
); //['apple', 'banana', 'kim']
Object.assign(obj1, obj2)
- 인자로 주어진 원본 객체(들)를 대상 객체에 붙여 넣는다.
대상 객체를 변경하고, 결과 객체를 반환한다.
첫 번째 인자: 대상 객체 (변경되는 객체)
두 번째 이상 인자들: 원본 객체(대상 객체에 더해지는 객체들)
얕은 복사임에 유의해야 한다.
둘 이상의 원본에서 붙여 넣을 수도 있다. (프로퍼티의 키가 같을 경우 뒤에 오는 인자의 것이 덮어쓴다.)
const intro1 = {
name: "홍길동"
};
const personal = {
age: 25,
married: false
};
Object.assign(intro1, personal); // intro1: 대상 객체, personal: 원본 객체
console.log(intro1); // {name: '홍길동', age: 25, married: false}
Object.preventExtensions(obj)
- 객체에 프로퍼티를 추가하는 것을 금지한다.
Object.isExtensible(obj)
- 해당 여부를 확인한다.
const obj = { x: 1, y: 2};
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false
obj.x++; // 프로퍼티 수정 가능
delete obj.y // 프로퍼티 삭제 가능
obj.z= 3; // 프로퍼티 추가 금지
Object.seal(obj)
- 객체에 프로퍼티를 추가하는 것과 삭제를 금지한다.
Object.isSealed(obj)
- 해당 여부를 확인한다.
const obj = { x: 1, y: 2};
Object.seal(obj);
console.log(Object.isSealed(obj)); // true
obj.x++; // 프로퍼티 수정 가능
delete obj.y // 프로퍼티 삭제 금지
obj.z= 3; // 프로퍼티 추가 금지
Object.freeze(obj)
- 객체를 동결한다.
Object.isFrozen(obj)
- 해당 여부를 확인한다.
const obj = { x: 1, y: 2};
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // true
obj.x++; // 프로퍼티 수정 불가
delete obj.y // 프로퍼티 삭제 금지
obj.z= 3; // 프로퍼티 추가 금지
⚠️ 얕게만 적용
깊은 동결
재귀적으로 객체를 가장 깊숙히까지 동결한다.
let myObj = {
a: 1,
b: {
c: 2,
d: {
e: 3,
f: {
g: 4
}
}
}
}
function getDeepFrozen(obj) {
console.log(obj);
const result = {};
const propNames = Object.getOwnPropertyNames(obj);
for ( const name of propNames ) {
const value = obj[name];
result[name] =
(value && typeof value === 'object') ?
getDeepFrozen(value) : value;
}
return Object.freeze(result);
}