상세 컨텐츠

본문 제목

JavaScript - 프로토타입(prototype)

개발/JavaScript

by 뉴에이스 2018. 12. 4. 11:02

본문

프로토타입(prototype)의 이해...
- 객체들의 공유 공간

모든 객체들은 생성시 부모가 생긴다.

소스
// new Member로 생성된 객체에 대한 부모가됨
// function Member 함수 객체에 대한 프로토타입의 공간이 있다. Member의 프로토타입의 객체
function Member(id, name, email) {
	this.id = id;
	this.name = name;
	this.email = email;
	// 모든 객체에서 동일하게 쓰이는 info에 대한 프로토타입 활용
	this.info = function() {
		console.log(this.id, this.name, this.email);
	};
}
// 자식인 new Member 객체는 부모인 function Member의 프로토타입 공간을 접근 할 수 있음
// 자식 객체 생서이 부모의 프로토타입 공간에 접근할 수 있는 변수가 기본으로 할당된다.
// 크롬에서는 __proto__
var m1 = new Member("hong", "홍길동", "hong@a.com");
var m2 = new Member("kang", "강감찬", "kang@a.com");

console.log("m1 : ", m1);
console.dir(m1);

결과
m1 :  Member { id: 'hong', name: '홍길동', email: 'hong@a.com', info: [Function] }
Member { id: 'hong', name: '홍길동', email: 'hong@a.com', info: [Function] }

소스
// 모든 객체는 부모의 프로토타입을 가리키는 변수가 있으며, 최종 부모는 Object이다
// 부모객체 - 프로토타입 공간이 있음
function Member(id, name, email) {
	this.id = id;
	this.name = name;
	this.email = email;
	/* 각 객체에 할당하는 부분을 부모의 prototype 공간에 설정 (메모리 효율적)
	this.info = function () {
	    console.log(this.id, this.name, this.email)
	}
	 */
}
// 부모객체인 function Member의 proto영역에 info 정보를 설정
Member.prototype.info = function() {
	console.log(this.id, this.name, this.email)
}

// 자식객체 - 부모의 프로토타입에 접근할 수 있는 변수 __proto__
// constructor : 자기를 가리키는 변수
var m = new Member("hong", "홍길동", "hong@a.com");
var m2 = new Member("k", "김", "king@a.com");
console.dir(m);
// m 객체에 info function을 생성함
m.info = function() {
	console.log("info");
};
//m.id= // m 객체에 등록
//Member.prototype.info.id= // 부모의 프로토타입에 등록
console.dir(m.id);
// m 객체에 info가 없을 경우 부모의 프로토타입에서 info를 찾는다
// Member.prototype 공간 접근
// m에 있는 info를 호출
m.info();
// m2에 info가 없으니 부모에proto여역에서 info를 찾는다
m2.info();


결과
Member { id: 'hong', name: '홍길동', email: 'hong@a.com' }
'hong'
info
k 김 king@a.com

소스
function Member(id, name) {
	this.id = id;
	this.name = name;
}
// Member의 prototype 공간에 id, name에 대한 setter, getter를 정의 하자
// constructor 프로퍼티가 자동으로 할당된다.
Member.prototype.setId = function(id) {
	this.id = id
};
Member.prototype.getId = function() {
	return this.id
};
Member.prototype.setName = function(name) {
	this.name = name
};
Member.prototype.getName = function() {
	return this.name
};

console.dir(Member);

// propoty라는 객체에 정의해서 프로토타입에 설정
// constructor 프로퍼티가 생성되지 않는다
Member.prototype = {
	setId : function(id) {
		this.id = id
	},
	getId : function() {
		return this.id
	},
	setName : function(name) {
		this.name = name
	},
	getName : function() {
		return this.name
	}

}
// constructor를 직접 정의, 자기 자신을 가리키도록
Member.prototype.constructor = Member;
console.dir(Member);

결과
[Function: Member]
[Function: Member]

소스
function Member(id) {
	this.id = id;
}
// Member 객체에 msg 변수 추가
Member.msg = "aaa";

var m = new Member("hong");
console.log(m.msg); // undefined
console.log(Member.msg); // Member 펑션에 직접 접근해서 사용

결과
undefined
aaa


관련글 더보기

댓글 영역