Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- local scope
- indexof
- npm 설치
- Bracket Notation
- package.json
- testbuilder
- for of
- JavaScript Runtime
- javascript 기초
- global scope
- 2번째 페어
- version control system
- 호이스팅
- supertest
- dot notation
- 코딩게임
- 코드스테이츠 1일차
- Splice
- nvm 설치
- node 설치
- foreach
- for in
- HTML 태그 모음
- 코플릿
- includes
- 스프린트 리뷰
- 슈도코드
- immutable
- TIL
- Jest
Archives
- Today
- Total
Honey-Programming
Instantiation Patterns 본문
Instantiation Patterns(인스턴스를 만드는 과정)
4가지 Class 선언 방식
1. Functional
2. Functional Shared
3. Prototypal
4. Pseudoclassical
1. Functional Instantiation 방식 (자동차 공장을 만들어 보자)
(1) 함수 실행했을 때, 찍어내 줄 객체를 선언
(2) someInstace의 position을 0으로 초기화, Car 함수가 실행되어 나온 인스턴스의 postion이 초기값은 항상 0
(3) someInstance에 move라는 메소드를 추가. function 내부에 있는 this는 someInstace를 뜻함
this.position은 someInstance.position과 같고, 실행시 position 값이 1만큼 증가할 것이다.
(4) return을 해주어야 함수의 결과로 객체가 나옴
(5) car1.move()를 실행한 후
(6) car1을 console.log로 찍어보면 postion이 1인 것을 확인
var Car = function() {
var someInstace = {}; // (1)
someInstace.position = 0; // (2)
someInstace.move = function() { // (3)
this.position += 1;
}
return someInstace; // (4)
};
var car1 = Car();
var car2 = Car();
car1.move(); // (5)
console.log(car1) // (6) {position: 1, move: ƒ}
초기 위치를 지정해 줄 수도 있다.
var Car = function(position) {
var someInstace = {};
someInstace.position = position;
someInstace.move = function() {
this.position += 1;
}
return someInstace;
};
var car1 = Car(5);
2. Functional Shared 방식 (자동차 공장을 만들어 보자)
(1) Car 함수를 선언해 준다. someInstance의 property로 position으로 넣어줬다.
var Car = function(position) {
var someInstace = {
position: position,
};
return someInstance;
};
(2) 메소드를 담아줄 객체를 생성한다. 모든 메소드는 someMethods에 담을 것! (이 예제는 move 함수 하나밖에 없지만...)
var someMethods = {}; // (2)
someMethods.move = function() {
this.position += 1;
};
var Car = function(position) {
var someInstace = {
position: position,
};
return someInstance;
};
(3) someInstace와 someMethods를 합치는 extend함수를 만들어서 Car함수 내부에 합친다.
var extend = function(to, from) { // (3)
for (var key in from) {
to[key] = from[key];
}
};
var someMethods = {};
someMethods.move = function() {
this.position += 1;
};
var Car = function(position) {
var someInstace = {
position: position,
};
extend(someInstance, someMethods); // (3)
return someInstance;
};
var car1 = Car(5);
var car2 = Car(10);
왜 이런 방식을 사용할까?
=> 이전의 Functional 방식은 instance를 생성할 때마다 모든 메소드를 someInstace에게 할당하므로
각각의 인스턴스들이 메소드의 수 만큼의 메모리를 더 차지하기 때문이다.
반면, Functional Shared 방식은 someMethods라는 객체에 있는 메소드들의 메모리 주소만을 참조하기 때문에 메모리 효율 좋음

3개, 4개의 인스턴스라서 메모리 차이는 얼마나지 않아보이지만, 만약 큰 프로젝트라면 차이가 많이 날것같다.
3. Prototypal
(1) Functional Shared 방식과 비슷하다. {}만 바꿔보자
var someMethods = {};
someMethods.move = function() {
this.position += 1;
};
var Car = function(position) {
var someInstace = {}; // (1) 이 부분 => {}
someInstance.position = position;
return someInstance;
};
(2) Object.create 는 특정 객체를 프로토타입을 하는 객체를 생성해 주는 함수
var someMethods = {};
someMethods.move = function() {
this.position += 1;
};
var Car = function(position) {
var someInstace = Object.create(someMethods); // (2)
someInstance.position = position;
return someInstance;
};
var car1 = Car(5);
var car2 = Car(10);
Object.create()
Object.create() 메서드는 지정된 프로토타입 객체 및 속성(property)을 갖는 새 객체를 만듭니다.
developer.mozilla.org
4. Pseudoclassical
(1) 메소드 프로토타입으로 만든다.
var Car = function(position) {
this.position = position;
};
Car.prototype.move = function() { // (1)
this.position += 1;
};
(2) 찍어낼 때는 new operator를 붙여야 된다. 가장 많이 쓰이는 방식이라 한다.
var Car = function(position) {
this.position = position;
};
Car.prototype.move = function() { // (1)
this.position += 1;
};
var car1 = new Car(5);
var car2 = new Car(10);
- OOP(Object Oriented Programming)가 무엇인지?
- JavaScript에서 Object를 생성하는 여러가지 방법들
- JavaScript에서 Prototype은 무엇이고 왜 사용해야 하는지?
'코드스테이츠 > Immersive' 카테고리의 다른 글
[자료구조] Graph, Tree, BST (0) | 2020.09.04 |
---|---|
[자료구조] stack, queue 구현하기 (0) | 2020.09.04 |
[자료구조] Linked List, Hash Table (0) | 2020.09.03 |
[자료구조] stack, queue (0) | 2020.09.03 |
Git workflow (0) | 2020.09.01 |
Comments