티스토리 뷰

자바스크립트에서 Class가 나오기 전, Object 생성하는 4가지 방법

 

1 ) Functional Instantiaiton : 함수를 이용해서 인스턴스 객체 생성하기

 

1. 함수 생성 : 함수 이름은 대문자로 시작(일반 함수와 구분하기 위함)

2. 빈 객체 생성 : 함수를 이용해 만든 객체(인스턴스)

3. 빈 객체에 프로퍼티 및 메서드 추가

4. 빈 객체 반환 : 인스턴스 반환

 

var Car = function() {
  var someInstance = {};
  someInstance.position = 0;
  someInstance.move = function() {
    this.position += 1; // this === someInstance
  }
  return someInstance; // 인스턴스 반환
 };

 

단점 : 함수 안에 메서드가 정의되어 있기 때문에 인스턴스(객체)를 생성할 때마다, 인스턴스에게 메서드를 할당하므로 인스턴스 메서드의 개수만큼 컴퓨터 메모리를 차지한다. 그래서 메모리 낭비가 심하다.

 


 

2 ) Functional Shared Instantiaiton : Functional 방법의 단점을 보완할 수 있다. 바로 인스턴스의 메서드를 함수 밖에 서 정의 및 할당한다. 그리고 인스턴스의 메서드를 공유하기 위해서 따로 외부 함수 extend를 만든다. 그러면 메서드의 메모리 주소만을 참조해서 메모리 효율에 좋다.

 

var extend = function(to, from) {
  for(var key in from) {
    to[key] = from[key];
  }
};


var someMethods = {}; // 함수 Car 외부에 인스턴스에게 공유할 메서드 정의 및 할당
someMethod.move = function() {
  this.positio += 1; // 함수 extend 통해 this === someInstance
};


var Car = function() {
  var someInstance = {};
  someInstance.position = 0;
  someInstance.move = function() {
    this.position += 1; // this === someInstance
  }
  return someInstance; // 인스턴스 반환
 };
 
 var car1 = Car(5);

 

1 . 함수 생성 : 함수 이름은 대문자로 시작(일반 함수와 구분하기 위함)

2. 함수 안에 빈 객체 생성 : 인스턴스

3. 빈 객체에 프로퍼티만 추가 : 빈 객체 안에서 프로퍼티 추가도 가능(결국 같음)

4. 함수 밖에 메서드 추가 : 인스턴스의 메서드 

5. 함수 안의 인스턴스(프로퍼티만 있는)와 함수 밖의 메서드 연결하기 : 외부 함수 extend 만들기

5 - 1.  외부 함수 extend의 첫 번째 인자는 인스턴스 객체, 두 번째 인자는 메서드 객체

5 - 2 .  for... in 이용하여 메서드 객체 있는 key와 value를 인스턴스 객체에 추가.

6.  빈 객체 반환 : 인스턴스 객체

 

장점 : 메서드 객체의 주소 값이 인스턴스 객체와 연결되어 있다. 메모리 효율에 좋다.

단점 : 메서드 객체 수정하고 인스턴스 객체를 생성하면 기존의 인스턴스의 메서드 객체의 주소와 수정한 인스턴스의 메서드 객체의 주소는 다르다. 

 


 

3 ) Prototypal Instantiation : 프로토타입 체인을 이용하여 인스턴스 객체 생성하기

 

Object.create() 메서드를 이용해서 인스턴스 객체의 부모 객체에 메서드 정의 및 할당한다

var someMethods = {};
someMethod.move = function() {
  this.positio += 1;
};


var Car = function() {
  var someInstance = Object.create(someMethods)
  someInstance.position = 0;
  someInstance.move = function() {
    this.position += 1; // this === someInstance
  }
  return someInstance; // 인스턴스 반환
 };
 
 var car1 = Car(5);

1. 함수 생성 : 함수 이름은 대문자로 시작(일반 함수와 구분하기 위함)

2. 인스턴스 객체 정의 하기 : Object.create() 메서드를 이용해서 메서드 객체를 할당하는 객체 생성.

3. Functional Shared Instantiation처럼 인스턴스의 메서드는 함수 밖에서 정의 및 할당/ 프로퍼티는 함수 안에서 추가

4. 인스턴스 객체 반환

 

**Object.create() 메서드는 특정 객체를 프로토타입으로 하는 객체를 생성한다.

const obj1 = Object.create(Object.prototype);

즉, 객체 obj1은 Object의 부모 객체를 상속받는다. 프토토타입의 참조가 주목적이다.

 

장점 :  부모 객체에 메서드를 정의하면 인스턴스의 메서드를 복사 없이 모든 객체의 메서드 접근 가능하다.

단점 :  인스턴스의 메서드를 사용하기 위해서 인스턴스를 만들어야하고, 함수에서 인스턴스 객체를 반환해야 한다.

 

 


4 ) Pesudoclassical Instantiation : 인스턴스 객체 생성 시, new 키워드 사용하며, this를 사용한다.

함수는 그냥 인스턴스 객체를 만들기 위한 틀이라고 생각하자! 함수 생성 시, 프로토타입 객체도 동시에 생성된다.

var Car = function(position) {
  this.position = position;
};
Car.prototype.move = function() {
  this.position += 1;
};

var car1 = new Car(5);

1. 함수 생성 : 함수 이름은 대문자로 시작(일반 함수와 구분하기 위함)

2. 빈 객체 생성 X : this를 이용해서 함수 안에서 프로퍼티 추가

3. 메서드 추가 : 부모 객체에 바로 메서드를 추가

4. 인스턴스 객체 반환 X

 

장점 : 인스턴스 객체를 생성하는데 최적화되어 있다. 함수에서 인스턴스 객체 반환할 필요가 없다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함