Object 객체
Object 객체는 모든 객체의 기본이 되는 프로토타입이다. 모든 객체는 Object 객체로부터 상속받은 프로퍼티와 메서드를 가지고 있다. Object 객체의 대표적인 프로퍼티와 메서드는 다음과 같다.
prototype
모든 객체는 prototype 프로퍼티를 가지고 있으며, 이는 해당 객체의 프로토타입을 참조한다. 이를 통해 상속을 구현할 수 있다.
constructor
객체가 생성된 생성자를 참조한다.
예: let obj = new Object();에서 obj.constructor는 Object를 가리킨다.
Object.keys(obj)
주어진 객체의 열거 가능한 속성 이름을 배열로 반환한다.
예: Object.keys({ a: 1, b: 2 })는 ['a', 'b']를 반환합니다.
Object.values(obj)
주어진 객체의 열거 가능한 속성 값들을 배열로 반환한다.
예: Object.values({ a: 1, b: 2 })는 [1, 2]를 반환한다.
Object.entries(obj)
주어진 객체의 열거 가능한 속성 [key, value] 쌍을 배열로 반환한다.
예: Object.entries({ a: 1, b: 2 })는 [['a', 1], ['b', 2]]를 반환한다.
Object.assign(target, ...sources)
하나 이상의 출처 객체의 모든 열거 가능한 속성을 대상 객체에 복사한다.
예: Object.assign({}, { a: 1 }, { b: 2 })는 { a: 1, b: 2 }를 반환한다.
Object.freeze(obj)
주어진 객체를 동결하여 더 이상 수정할 수 없도록 만든다. 속성을 추가하거나 삭제할 수 없다.
예: const obj = { a: 1 }; Object.freeze(obj); obj.a = 2;는 obj.a가 여전히 1로 남는다.
Object.seal(obj)
주어진 객체를 봉인하여 새로운 속성을 추가할 수 없지만 기존 속성의 값을 수정할 수 있도록 한다.
예: const obj = { a: 1 }; Object.seal(obj); obj.b = 2;는 obj에 b 속성이 추가되지 않는다.
프로토타입
프로토타입은 객체가 다른 객체로부터 속성과 메서드를 상속받는 메커니즘이다. 모든 객체는 프로토타입을 가지고 있으며, 이 프로토타입을 통해 객체 간의 관계를 형성한다.
//Person 생성자 함수 정의
function Person(name) {
this.name = name; //인스턴스의 name 속성 설정
}
//Person의 프로토타입에 sayHello 메서드 추가
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
//Person 인스턴스 생성
const p1 = new Person('신짱구'); //첫 번째 인스턴스
const p2 = new Person('짱아'); //두 번째 인스턴스
const p3 = new Person('철수'); //세 번째 인스턴스
//각 인스턴스에서 sayHello 메서드 호출
p1.sayHello(); //"Hello, my name is 신짱구"
p2.sayHello(); //"Hello, my name is 짱아"
p3.sayHello(); //"Hello, my name is 철수"
생성자 함수 안에 메서드를 정의하지 않고 프로토타입을 통해 속성을 설정하는 이유는 프로토타입을 사용하면 모든 인스턴스가 메서드를 공유하게 된다. 즉, 각 인스턴스가 메서드를 개별적으로 가지고 있지 않고, 프로토타입에 정의된 메서드를 참조하기 때문에 메모리 사용량이 줄어든다.
Object 객체의 확장
Object 객체를 확장하여 새로운 기능을 추가할 수 있다. 예를 들어, Object.prototype에 새로운 메서드를 추가하면 모든 객체에서 해당 메서드를 사용할 수 있게 된다.
//Object.prototype에 sayGoodbye 메서드 추가
Object.prototype.sayGoodbye = function() {
console.log(`Goodbye from ${this.name}`);
};
//새로운 객체 생성
const person = {
name: '신짱구' //name 속성 정의
};
person.sayGoodbye(); //"Goodbye from 신짱구"
Object 객체 확장 시 문제점
Object 객체를 확장할 때는 몇 가지 문제점이 발생할 수 있다.
전역 영향
Object.prototype을 확장하면 모든 객체에 영향을 미치므로, 다른 코드나 라이브러리와의 충돌이 발생할 수 있다.
열거 가능성
기본 객체에 추가된 프로퍼티는 기본적으로 열거 가능하므로, for...in 루프와 같은 방법으로 순회할 때 포함될 수 있다. 이는 예기치 않은 결과를 초래할 수 있다.
hasOwnProperty
이러한 문제를 해결하기 위해 hasOwnProperty 메서드를 사용할 수 있다. 이 메서드는 객체가 특정 프로퍼티를 직접 가지고 있는지를 확인하는 데 유용하다. 이를 통해 상속된 프로퍼티와 구분할 수 있으며, 예기치 않은 동작을 방지할 수 있다.
const obj = {
name: '신짱구',
age: 5
};
//obj가 name 속성을 직접 가지고 있는지 확인
console.log(obj.hasOwnProperty('name')); //true
//obj가 toString 메서드를 직접 가지고 있는지 확인
console.log(obj.hasOwnProperty('toString')); //false
'Language > JavaScript' 카테고리의 다른 글
[JS]this (0) | 2025.01.14 |
---|---|
[JS]apply, call 메서드 (0) | 2025.01.13 |
[JS]arguments 객체 (0) | 2025.01.10 |
[JS]let, const, var (0) | 2024.12.30 |
[JS]템플릿 리터럴(Template Literal) (1) | 2024.12.24 |