01. 객체의 생성
자바스크립트의 객체는 이름과 값을 한 쌍으로 묶은 집합입니다. 이름과 값이 한 쌍을 이룬 것을 프로퍼티라고 하고, 그것의 이름을 프로퍼티 이름 또는 키(key)라고 합니다.
** 함수의 참조를 값으로 가진 프로퍼티는 메서드라는 이름으로 부릅니다.
객체 리터럴로 생성하는 방법
var card = { suit: "하트" , rank: "A" };
생성자로 생성하는 방법
function Card(suit,rank) {
this.suit = suit;
this.rank = rank;
}
var card = new Card("하트", "A");
객체 리터럴로 생성하는 방법
var card = Object.create(Object.prototype,{
suit: {
value : "하트",
writable: true,
enumerable: true,
configurable: true
},
rank: {
value: "A",
writable: true,
enumerable: true,
configurable: true
}
});
02. 프로퍼티
생성자 안에서 메서드를 정의하는 방식의 문제점
생성자 안에서 this 뒤에 메서드를 정의하면 그 생성자로 생성한 모든 인스턴스에 똑같은 메서드가 추가됩니다. 따라서 메서드를 포함한 생성자로 인스턴스를 여러 개 생성하면 같은 작업을 하는 메서드를 인스턴스 개수만큼 생성하게 되며 결과적으로 그만큼의 메모리를 소비하게 됩니다.
🎃 이러한 문제는 프로토타입 객체에 메서드를 정의하는 방식으로 해결할 수 있습니다.
function Circle(center, radius) {
this.center = center;
this.radius = radius;
this.area = function() {
return Math.PI*this.radius*this.radius;
};
}
var c1 = new Circle({x;0, y:0}, 2.0);
var c2 = new Circle({x;0, y:1}, 3.0);
var c3 = new Circle({x;1, y:0}, 1.0);
프로토타입 객체
자바스크립트에서는 함수도 객체이므로 함수 객체가 기본적으로 prototype 프로퍼티를 갖고 있습니다.
portotype 프로퍼티는 기본적으로 빈 객체를 가리킵니다.
function F() {};
console.log(F.prototype); //-> object {}
프로토타입 객체의 프로퍼티는 생성자로 생성한 모든 인스턴스에서 그 인스턴스의 프로퍼티 처럼 사용할 수 있습니다.
또한 프로토타입 객체의 프로퍼티는 읽기만 가능하고 수정이 불가능 합니다.
F.prototype.prop = "prototype value";
var obj = new F();
console.log(obj.prop); //-> prototype value
인스턴스의 프로퍼티에 값을 대입했을 때 일므이 같은 프로퍼티가 있으면 그 프로퍼티에 값을 대입합니다. 그렇지 않을 때는 인스턴스에 그 이름으로 프로퍼티를 추가한 후에 값을 대입합니다.
obj.prop = "instance value";
console.log(obj.prop); // -> instance value
console.log(F.prototype.prop); //-> prototype value
프로토타입 객체의 프로퍼티를 인스턴스에서 참조할 수 있는 상황을 가리켜 '인스턴스가 프로토타입 객체를 상속하고 있다'라고 하며 상속 구조는 '프로토타입 체인'이라는 메커니즘을 바탕으로 구현 되어 있습니다.
// Circle 생성자
function Circle(center, radius) {
this.center = cetner;
this.radius = radius;
}
// Circle 생성자의 protototype 프로퍼티에 area 메서드를 추가
Circle.prototype.area = function(){
return Math.PI * this.radius * this.radius;
};
// Circle 생성자로 인스턴스를 생성
var c1 = new Circle({x;0, y:0}, 2.0);
var c2 = new Circle({x;0, y:1}, 3.0);
var c3 = new Circle({x;1, y:0}, 1.0);
생성자의 프로토타입 객체에 메서드를 추가하면 인스턴스에 메서드를 추가하지 않아도 인스턴스가 프로토타입 객체의 메서드를 사용할 수 있으므로 메모리의 낭비를 피할 수 있습니다.
메서드 체인
메서드가 객체를 반환하면 반환한 객체의 메서드를 호출 할 수 있습니다. 그러면 메서드를 다음과 같이 마침표 연산자로 계속 연결해서 실행 시킬 수 있습니다.
객체.메서드1().메서드2().메서드3()....
이러한 표기법을 메서드 체인이라고 부릅니다. 객체를 한 번만 표기하고 관련 있는 메서드를 여러 개 호출하는 프로그래밍 스타일 입니다.
참고문헌
📌 모던 자바스크립트 입문 책
'FRONTEND > JS' 카테고리의 다른 글
[개발의 본질] 투두리스트 JS로 만들기 | 토이 프로젝트 02 (0) | 2022.04.03 |
---|---|
[JS] 프로토타입 상속 ver.01 (0) | 2022.03.30 |
[JS] appendChild 를 이용해서 노드를 옮기는 방법 (1) | 2022.03.16 |
[JS] 노드 생성과 삽입 createElement & appendChild (0) | 2022.03.14 |
[JS] innerHTML vs innerTEXT vs textContent 차이 (0) | 2022.03.13 |