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() : 성능과 가독성이 떨어짐