자바스크립트는 함수에 자동으로 객체인 prototype 프로퍼티를 설정해 둔다. 이 함수를 new 키워드와 함께 생성자 함수로 사용하면 인스턴스가 생성된다. 이 인스턴스에는 __proto__
라는 숨겨진 프로퍼티가 자동으로 생성된다.
__proto__
프로퍼티는 생성자 함수의 prototype 프로퍼티를 참조한다. 따라서 생성자 함수의 prototype 객체에 프로퍼티나 메서드가 있다면 인스턴스는 __proto__
프로퍼티를 통해 그것에 접근할 수 있다.
배열은 Array
클래스의 인스턴스이다.
우리가 자주 사용하는 배열 메서드인 .push, .slice, .map 등은 Array.prototype
의 속성이며 배열은 프로토타입 체인을 통해 이들 메서드에 접근한다. 이를 프로토타입 메서드라 한다.
다만 배열에 사용되는 모든 메서드가 프로토타입에 연결되어 있는 것은 아니다. Array.isArray
처럼 static 키워드를 이용하여 클래스 레벨에서 정의된 메서드를 스태틱 메서드라 한다. 스태틱 메서드는 인스턴스가 참조하지 않는다.
Array.isArray
는 인자가 배열인지 여부를 판별한다.
만약 isArray
가 프로토타입 메서드라면 제기능을 하지 못할 것이다. 배열 객체만이 프로토타입 체인을 통해 isArray
메서드에 접근할 수 있으니, 검사하고자 하는 대상이 배열이 아니라면 isArray
메서드를 사용하는 순간 에러가 발생할 것이다.
이처럼
1. 만들어진 인스턴스의 데이터를 참조할 필요가 없는 경우
2. 모든 객체가 동일하게 참조해야 하는 특성이나 행동이 있는 경우
static 키워드를 사용하여 메서드나 프로퍼티를 정의한다.