<프로토타입이 뭔지 알기 위해 먼저 알아야 할 것들>
1. 생성자 함수와 인스턴스
1. 생성자 함수 : 객체를 생성하는 함수이다.
function SomeObj(name, kind) { this.name = name; // 변수 정의 this.kind = kind; this.someFunction = function() { // 함수 정의 alert(this.name + this.kind) }; }; // 자바스크립트에서는 이런식으로 객체를 생성한다. 이제 이 SomeObj함수를 사용하면 객체를 만들 수 있다.
2. 인스턴스 : 정의되어 있는 클래스를 실제 사용하기 위해 new연산자를 통해 메모리상에 객체를 구현한 것
1. var obj = new SomeObj('abc', 'killer') 라고 하면 위에서 정의한 클래스를 토대로 메모리상에 obj라는 객체를 구현한다.
2. 여기서 obj를 인스턴스라고 하고, SomeObj를 생성자함수라고 한다.
이제 프로토타입에 대해서 알아보자
1. 프로토타입이란?
1. 자바스크립트는 함수가 만들어지면 그 함수에 자동으로 prototype(이하 프로토타입) 프로퍼티를 생성한다. (여기서 프로퍼티란 그냥 멤버필드 혹은 자원이라고 생각하면 된다.)
2. 즉 내가 위에서 SomeObj를 정의한 순간 prototype도 같이 안에 만들어져진다. 이건 내가 만드는게 아니라 자바스크립트가 내부에서 자동으로 만드는 것이다.
3. var obj = new SomeObj('leeNOW', 'femmeFatale') 하는 순간 obj에 객체가 생성되면서 obj인스턴스가 생성된다.
4. 그리고 이 때 obj인스턴스 안에 자동적으로 __proto__(이하 던더프로토)가 생성되고 생성자의 프로토타입을 참조한다.
5. 던더프로토는 생성자의 프로토타입을 참조하기때문에 프로토타입 안에 있는 자원을 그대로 사용할 수 있다.
6. SomeObj.prototype.anyFunction = function() {} 이런식으로 생성자의 프로토타입안에 자원을 추가할 수 있다.
7. 프로토타입안에 있는 것은 던더프로토 안에도 있기 때문에 인스터스생성시 obj.__proto__.anyFuntion() 이렇게 사용할수 있다.
8. 그러나 __proto__는 생략가능하기 때문에 우리는 바로 obj.anyFunction() 이렇게 사용할 수 있다.
9. 결론적으로 생성자의 프로토타입에서 정의된것은 그 생성자로 만들어진 인스턴스의 던더프로토안에도 정의되어 있다.
10. 배열생성자함수인 Array와 그 인스턴스 arr의 예를 보면서 다시 한 번 이해 및 정리해보자
// 브라우저를 키고 개발자모드에서 다음 코드를 쳐보자. var arr = [1,2]; console.dir(arr); console.dir(Array); // arr, Array의 던더프로토와 프로토타입을 서로 비교해보자 완전히 같음을 알 수 있다. // arr의 던더프로토가 Array의 프로토타입을 참조하기 때문이다. // 따라서 arr의 던더프로토를 이용하여 생성자함수의 프로토타입에 정의된 모든 자원을 활용 할 수 있다. arr.__proto__.pop(); // 하지만 이렇게 하면 예상치 못한 결과가 나올 경우가 있다. // 그 이유는 this를 사용한 코드가 있으면 this가 가르키는 곳이 의도했던것과 달라지기 때문이다. // __proto__는 생략가능하므로, 이렇게 쓰자 arr.pop(); 이게 우리가 흔히 쓰던 사용법일 것이다. // 또한 Array생성자 바로 밑에 있는 자원은 프로토타입에 있지 않기 때문에 직접 불러서 써야한다. Array.isArray(arr); // 이런식으로 직접 생성자 함수를 불러다가 써줘야한다. // 이제 당신은 어떤 함수는 인스턴스에다 직접 써도 되고 (생성자함수의 프로토타입안에 있는 자원들) // 어떤함수는 생성자함수를 불러다가 써줘야하는지 알게된 것이다. (생성자함수 안에 있는 자원들)
*틀린 점이 있다면 댓글로 달아주세요. 아직 배우는 학생이랍니다.
*질문도 댓글로 적어주시면 답변할 수 있는 한도내에서 답변해드리겠습니다.
감사합니다. "쿠쿠하마"입니다.
'javaScript > 중급' 카테고리의 다른 글
자바스크립트가 메모리에 데이터를 저장하는 방식 (0) | 2020.06.22 |
---|