[[Prototype]] 과 프로토타입 객체
- 모든 JS 객체는 [[Prototype]] 이라는 숨김 프로퍼티를 갖는다!
- [[Prototype]] 이 다른 객체를 참조하고 있을 때 그 참조하는 대상을 프로토타입 객체 라고 한다.
__proto__
- [[Prototype]] 은 직접 접근이 불가능하다. 프로토타입 체인의 단방향성 때문.
- [[Prototype]] 의 getter 이자 setter인 __proto__ 로 접근 가능
- 최근에는 Object.getPrototypeOf / Object.setPrototypeof 를 사용
함수의 prototype 프로퍼티
// 생성자 함수
const Person = function (name, age) {
this.name = name;
this.age = age;
};
const person = new Person('Ham', 24);
console.log(Person.prototype === person.__proto__); // true -- (1)
console.log(Person.prototype.constructor === Person); // true -- (2)
- 모든 JS 함수는 prototype 프로퍼티를 갖는다!
- 단, 화살표 함수에는 prototype 프로퍼티가 없다.
- (1) prototype 프로퍼티는 기본값으로 constructor 하나만 있는 객체(프로토타입 객체)를 가리킨다.
- (2) 그 constructor 는 함수 자신을 가리킨다.
.__proto__ vs .prototype
사용 주체 | 참조하는 값 | 사용 목적 | |
.__proto__ | 모든 객체 | 프로토타입 | 객체가 자신의 프로토타입에 접근(get), 교체(set)하기 위해 사용 |
.prototype | 모든 함수 | 프로토타입 | 생성자 함수가 자신이 생성할 객체(인스턴스)의 프로토타입을 할당하기 위해 사용 |
리터럴 표기법에 의해 생성된 객체의 생성자 함수와 프로토타입
// 객체 리터럴
const Person1 = {
name: 'Ham',
age: 24,
};
console.log(Person1.__proto__ === Object.prototype); // true -- (2)
console.log(Person1.__proto__.constructor === Object); // true -- (1)
(1) 생성자 함수 | (2) 프로토타입 | |
객체 리터럴 | Object | Object.prototype |
함수 리터럴 | Function | Function.prototype |
배열 리터럴 | Array | Array.prototype |
정규표현식 리터럴 | RegExp | RegExp.prototype |
'TIL > JavaScript' 카테고리의 다른 글
[240130] 스코프, 스코프 체인, 프로토타입, 프로토타입 체인 (0) | 2024.01.30 |
---|---|
[240130] 자바스크립트의 객체 생성 방법(객체 리터럴 vs new Object() vs 생성자 함수 vs 클래스) (1) | 2024.01.30 |
[240126] 실행 컨텍스트 - (1) (0) | 2024.01.26 |
[240108] const로 선언한 배열, 객체의 요소 또는 속성을 변경할 수 있는 이유는 무엇일까 (0) | 2024.01.08 |
[240105] 호이스팅, 변수 생성 과정, TDZ (0) | 2024.01.05 |