JavaScript 객체 지향 - prototype vs __proto__

김민재·2021년 7월 10일
0

  • 자바스크립트에선 함수 역시 객체이다.
  • 객체이기 때문에 property를 가지게 된다.


-함수를 정의하면 새로운 객체가 생성된다.


-하나는 Person이라는 객체이며 또 하나는 Person의 prototype이라는 객체이다.


-두 가지 객체는 서로 연관되어있기 때문에 Person 객체는 prototype이라는 프로퍼티가 생기고 그 프로퍼티는 내부적으로 Person의 prototype 객체를 가르킨다.

-마찬가지로 Person의 prototype 객체도 자신이 Person의 소속임을 밝히기 위해 constroctor라는 프로러티를 만들고 그 프로퍼티는 Person을 가르킨다.
-두 객체는 서로 간에 상호 참조를 하고 있다.


-Person.prototype.sum = funcion(){}의 의미는 객체를 찍어내는 공장인 Person이라고 하는 constroctor function을 만든 것이다.

-kim이라는 객체를 new키워드로 만들면 Person이라는 constroctor function이 실행되면서 this의 값이 세팅되고 프로퍼티의 값인 name, first, second이 생성된다.
-동시에 __proto__라는 프로퍼티도 생성된다. __proto__프로퍼티는 kim 객체를 생성한 Person의 prototype을 참조한다.
-이 때문에 Person.prototype과 Kim.__proto__를 통해서도 Person의 prototype 객체에 접근할 수 있는 것이다.

-lee라는 새로운 객체도 lee.__proto__를 통해서도 Person의 prototype 객체에 접근할 수 있다.
-kim.name은 kim 객체의 name이라는 프로퍼티 값을 찾으라는 것을 의미하며 kim객체의 sum이라는 메소드를 찾게되고 없다면 __proto__가 가리키고 있는 Person의 prototype객체에 sum 메소드가 있는지 찾게된 후 사용한다.

결론!

생성자로 만들어진 객체에서 해당 객체에 없는 함수를 호출할때 객체 프로퍼티 __proto__를 통해서 부모 prototype의 객체에서 메소드를 찾아 호출한다.

-부모 Person 객체에서 prototype 프로퍼티는Person's prototype 객체를 가르켜 자식 객체에서 호출할때 부를수 있도록 만들어준다.
-자식인 kim과 lee의 proto 프로퍼티 역시 Person's prototype 객체를 가르켜 부모 프로퍼티, 메소드를 호출 할수 있도록합니다.

profile
자기 신뢰의 힘을 믿고 실천하는 개발자가 되고자합니다.

0개의 댓글