JavaScript(이하 ECMAScript)를 처음 접하면 프로토타입 개념이 혼란을 일으키곤 하는데, Object가 어떻게 생성되고 프로퍼티를 어떻게 읽고 쓰는지만 확실히 기억해두면 혼란을 피할 수 있다.
Object 생성하기 (( ECMA-262 13.2.2 ))
ECMAScript에서 오브젝트란 프로퍼티들의 정렬되지 않은 컬렉션이다. 오브젝트는 생성자를 통해 만들어진다. Foo()라는 생성자가 있다면 다음의 방법으로 만들 수 있다.
x = new Foo();
이 때 생성자가 prototype
이란 이름의 프로퍼티를 갖고 있다면 그 프로퍼티의 값이 생성되는 오브젝트의 프로토타입이 된다.
Foo.prototype = new Number();
x = new Foo();
new Number() 오브젝트는 x의 프로토타입이므로, x 오브젝트에 어떤 property를 추가하지 않았더라도 그 property가 new Number() 오브젝트에 존재한다면 x 오브젝트의 프로퍼티처럼 읽게 된다. 다음 절을 읽어보자.
프로퍼티 읽기/쓰기
ECMASCript에서 오브젝트의 프로퍼티의 읽기/쓰기는 다음과 같이 동작한다.
읽기
프로퍼티를 읽는 내부 메소드를 GET이라고 한다. GET은 다음과 같이 동작한다. (( ECMA-262 8.12.3 ))
어떤 오브젝트에 대해 GET P를 하면,
- 이름이 P인 프로퍼티가 있으면 그 프로퍼티의 값을 반환
- 없으면 [[Prototype]] 내부 메소드로 프로토타입을 가져오고 null이 아니라면 [[Get]] (P) 를 수행, null이면 undefined 반환.
쓰기
프로젝트를 쓰는 내부 메소드를 PUT이라고 하는데, PUT은 프로퍼티 존재 유무 확인하고 그런 거 없이 그냥 현재 오브젝트에 바로 값을 쓴다. 쓸 수 없다면 예외를 던진다. (( ECMA-262 8.12.5 ))
“ECMAScript(JavaScript)의 Object와 Property”에 대한 1개의 생각