책장/Javascript

[JavaScript] new

TERAJOO 2020. 8. 28. 17:23

코딩하는 과정에서 객체를 정의할 때 해당 객체의 프로퍼티를 셋팅하도록 설정한다면 해당 객체를 추후 재활용하는데에 귀찮음과 어려움이 생길 수 있다.

-> 이를 보완하기 위해 생성자를 새용해 원하는 프로퍼티의 인스턴스를 생성할 수 있도록 해줄 수 있다.

즉 생성자 패턴을 도입함으로써 코드의 재사용성을 대폭 높혀 레고 블럭인 객체를 좀더 자유자제로 사용할 수 있게 된다.

 

- 함수를 호출할 때 new 를 붙이면 해당 함수는 새로운 객체를 만든 후에 이를 리턴한다. 해당 객체의 생성자를 호출한다고 생각하면 편하다.

- 일반적인 객체지향 언어에서 생성자는 클래스의 소속이다. 하지만 자바스크립트에서 객체를 만드는 주체는 함수이다. 즉, 함수에 new 를 붙이는 것을 통해 객체를 만들 수 있다는 것은 자바스크립트의 특징이면서 자바스크립트가 추구하는 자유로움을 보여주는 사례라고 할 수 있다.

 


객체지향언어에서는 보통 클래스를 인스턴스화 시키기 위해 new 연산자를 사용한다. 

하지만 자바스크립트에서는 두개의 객체를 연결하기 위해 new 연산자를 사용한다.

 

즉, 전자의 경우 클래스로부터 작동을 복사하여 새로운 객체를 만드는 것이고, 후자의 경우 복사 과정 없이 그저 두 객체를 연결한다는 것이다. 따라서 자바스크립트의 new 키워드는 흔히 아는 new 키워드와 다르게 동작한다고 할 수 있다.

다시 말해 JavaScript 에서 new 연산자는 결국 새 객체를 다른 객체와 연결하기 위한 간접적인 우회 방법이며, 직접적으로 연결해주기 위해 Object.create() 을 이용하기도 한다.

 또한 [[Prototype]] 체계를 흔히들 프로퍼타입 상속이라고도 부르는데 상속은 기본적으로 복사를 수반하지만, 자바스크립트는 객체 프로퍼티를 복사하지 않고, 연결만 한다는 점에서 약간은 다르다. 따라서 프로퍼타입 상속이라는 말은 의미를 좀 헷갈리게 한다고 할 수 있고, 다른 적절한 단어인 위임이라고 생각하면 더 정확하지 않을까 한다.