일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- gql restapi 차이
- 코어자바스크립트
- Js module
- 타입스크립트
- 리액트 메모이제이션
- 자바스크립트 엔진 v8
- 함수형 프로그래밍 특징
- toggle-btn
- this
- v8 원리
- 렌더링 최적화
- js배열 알고리즘
- 항해99 사전스터디
- next js
- 리액트 렌더링 최적화
- 리액트 메모
- 실행컨텍스트
- JS module system
- 웹팩 기본개념
- 항해99 미니프로젝트
- 리덕스
- jwt
- 리액트
- 항해99 부트캠프
- chromatic error
- 항해99
- 웹 크롤링
- 테스트 코드 툴 비교
- 알고리즘
- FP 특징
- Today
- Total
Jaeilit
코어 - 프로토타입 본문
프로토타입
프로토타입 도식화
- 어떤 생성자 함수를 new 연산자와 함께 호출할때 Constructor(생성자 함수 초기화) 가 생긴다
- 이 Constructor 는 instance 가 생기게 된다.
- instance 는 __proto__ 라는 프로퍼티가 자동으로 부여된다.
- 이 프로퍼티는 prototype이라는 프로퍼티를 참조한다.
코드
var Person = function (name) {
this._name = name;
};
Person.prototype.getName = function() {
return this._name;
};
let suzi = new Person('Suzi')
Person.prototype === suzi.__proto__ // true
Person.prototype // { getName: ƒ () }
suzi.__proto__ // { getName: ƒ () }
Object.getPrototypeOf(suzi) // { getName: ƒ () }
suzi.__proto__ === Object.getPrototypeOf(suzi) // true
ES5 명세에는 __proto__ 가 [[prototype]] 으로 정의되어있다.
의미상 달리진게 아니니 위의 4가지 순서를 코드로 살펴보면
- Person 이라는 함수를 생성자 함수로 만들었다.
- suzi 라는 인스턴스가 생기게 됬고
- Person.__proto__ 또는 Person.prototype 을 해보면 { getName: f() } 를 가지고 있다.
- 결국 Person.__proto__ (Constructor.__proto__) or suzi.__proto__ (instance.__proto__) 같은 값을 참조하고 있다.
__proto__ 는 생략이 가능하다.
suzi.__proto__.getName(); // undefined
suzi.__proto__._name = 'SUZI__proto__';
suzi.__proto__.getName(); // SUZI__proto__
var suzi = new Person('Suzi', 28);
suzi.getName(); // Suzi
var iu = new Person('Jieun', 28);
iu.getName(); // Jieun
suzi.__proto__.getName() 은 undefined 가 출력 됩니다.
getName() 함수는 실행됬고 메모리도 할당 됬지만 값이 없기 때문에 undefined 를 가지고 있습니다.
이유는 this 에 있습니다.
this가 메서드로 사용 될 경우 메서드 명 바로 앞이 this 가 되는데 getName() 의 this 는 suzi.__proto__ 타입입니다.
suzi.__proto__ 타입이 name을 가지고 있지 않기 때문에 undefined가 할당 됬습니다.
바로 밑에서 suzi.__proto__._name 에 값을 할당해준다면 undefined가 아닌 할당 한 값이 출력됩니다.
하지만 매 순간 suzi.__proto__ 에 값을 할당 해주기는 어렵습니다.
인스턴스 생성 시 this도 같이 만들어지면 좋겠습니다만 그 방법은 __proto__ 타입을 생략하고 곧바로 메서드를 사용 하는 것 입니다.
__proto__ 를 빼면 suzi.getName() 은 this 가 suzi 인스턴스가 되니까 name 은 new 생성자 함수의 인자가 this.name이 되는게 맞습니다.
하지만 왜 되냐..? 생략이 가능한 프로퍼티이기 때문입니다. (그냥 그런가보다...)
# 생략 가능한 프로퍼티 __proto__
arr = [1, 2] 와 생성자 Array 를 console 로 찍어보면
arr 변수는 인스턴스로 1, 2 를 가지고 있고 prototype 을 또 가지고 있습니다.
생성자 Array 는 인스턴스없이 prototype 을 가지고 있습니다.
__proto__ 가 생략이 가능하기 때문에
배열을 사용 할때 arr.__proto__.method() 를 사용하지는 않습니다.
'JavaScript' 카테고리의 다른 글
호이스팅 예제 (0) | 2024.04.10 |
---|---|
이벤트버블링 (0) | 2022.10.01 |
코어 - 클로저 (0) | 2022.06.30 |
코어 - 콜백함수 (0) | 2022.06.20 |
코어 this(2) (0) | 2022.06.08 |