1. 객체, 클래스

자바는 클래스로 표현하고 클래스는 생성자, 필드, 메소드 등을 가지고 있다. 객체를 인스턴스화하기 위해서는 생성자를 활용한다.

자바스크립트에서 객체를 생성하는 방법은 다음과 같다.

  • Object.create()
  • Object() 생성자 : new Object()를 통해 객체 래퍼를 생성하는 방식이다. 객체 리터럴을 사용하는 것이 코드가 간결해진다.
  • 생성자 함수 : 자바의 문법과 비슷하다. 또 생성자 호출 시 괄호 생략이 가능하다. 그렇지만 권장하지는 않는다.  
  • 생성 함수 : 자바에서 객체 인스턴스화 시 사용하는 스태틱 팩토리 방법과 유사한 하나의 팩토리 메소드이다. (단지 생성 함수 내부에서 객체 생성의 세부사항을 감싸기 위한 하나의 방법) 
  • 객체 리터럴 : new Object()보다 낫다. ES5부터 getter, setter 접근자를 지원한다. 
  • ES6의 클래스 : 자바의 문법과 매우 유사하다. class라는 키워드를 사용하긴 하나 자바의 클래스와 전혀 다르다. 자바스크립트에는 static 클래스, private 클래스 등도 없다.  

2. 런타임 중 수정

자바는 동적언어가 아니기 때문에 객체가 생성되면 런타임 중에 메소드를 수정하기 거의 어렵다고 할 수 있다. 

자바스크립트는 서로운 프로퍼티를 수추가하고 메소드를 교체하는 것과 같은 런타임 중에 객체 생성 및 수정이 가능하다. (동적언어라면 다 된다)


3. 프로퍼티

자바의 객체에는 필드와 메소드가 있다.

자바스크립트는 논리적으로 프로퍼티의 집합이고 프로퍼티는 Stirng 타임의 이름과 속성을 가지고 있다. 자바스크립트의 속성, 즉 Attribute는 프로퍼티 상태를 정의하고 설명하는데 사용된다. 그리고 프로퍼티에는 데이터 프로퍼티와 접근 프로퍼티의 형태가 있다.

3.1. 속성

3.1.1. 데이터 프로퍼티 속성

  • value : 자바스크립트의 모든 자료형 가능
  • writable : 데이터 프로퍼티의 변경 가능 여부 정의
  • enumerable : for-in 구문을 이용하여 열거 가능 여부 정의
  • configuable : 제거 가능 여부, 접근 프로퍼티 변경 여부, 쓰기 불가 여부, enumerable 속성의 수정 가능 여부 정의

3.1.2. 접근 프로퍼티 속성

  • get 접근자 (get accessor) : Function 객체 혹은 undefined 지정
  • set 접근자 (set accessor) : Function 객체 혹은 undefined 지정
  • enumerable : for-in 구문을 이용하여 열거 가능 여부 정의
  • configuable : 제거 가능 여부, 데이터 프로퍼티 변경 가능 여부, 다른 속성들의 수정 가능 여부를 정의

객체의 프로퍼티에 접근하기 위해선 점 표기법, 대괄호 표기법을 사용한다. 

  • 점 표기법 : 자바에서 접근하는 방식과 동일하다.
  • 대괄호 표기법 : 자바스크립트에서 프로퍼티 이름은 문자열이다. 대괄호 표기법에서 문자열이 아닌 객체를 사용할 때는 toString() 메소드를 통해 문자열로 변환한다. 

3.2. 프로퍼티 수정

자바스크립트에서 Object.defineProperty, Object.defineProperty를 통해 객체 프로퍼티를 수정할 수 있다.


4. 함수, 메소드

자바의 메소드와 달리 자바스크립트의 함수는 내장 객체인 Function 생성자로 생성된 객체이다. 즉 또다른 객체이다. 

자바스크립트의 메소드는, 함수가 객체의 프로퍼티일 때 메소드라 한다. 이런 관계로 볼 때 자바스크립트에서 메소드는 함수지만, 모든 함수가 메소드인건 아니다.

함수는 객체니까 프로퍼티와 메소드를 가질 수 있다. 객체가 함수인지 아닌지는 instanceof 명령어로 확인할 수 있다.

var myvar = function() {};
console.log(myvar instanceof Function);

자바스크립트의 함수는 Function 생성자에 의해 생성된다는 차이점 외에 함수와 다른 객체의 차이점이  또 있다. 함수는 호출할 수 있지만 다른 객체는 호출할 수 없다. 그리고 함수는 prototype 프로퍼티를 가지고 있지만 다른 객체는 아니다. 

자바스크립트에서 함수 생성 방법은 다음과 같다.

  • 함수 선언 : function declaration
  • 함수 표현식 : function expression
  • new Function() : 성능과 가독성이 떨어짐