프로토타입 객체
프로토타입은 객체지향의 핵심인 상속을 구현하기 위해 사용됩니다
프로토타입은 부모객체의 역할을 하는 객체로 다른 객체에 공유 프로퍼티를 제공합니다
프로퍼티를 상속받은 하위객체는 부모객체의 프로퍼티를 자유롭게 사용 할 수 있습니다
모든 객체는 [[Prototype]] 이라는 내부 슬롯이 있으며 [[Prototype]] 에 저장되는 프로토 타입은 객체 생성 방식에 의해 결정됩니다
__proto__ 접근자 프로퍼티
모든 객체는 __proto__ 접근자 프로퍼티를 사용하여 [[Prototype]] 내부에 간접적으로 접근이 가능합니다
1 2 3 4 5 6 | const obj = {}; const parent = { num: 7 }; obj.__proto__ = parent; console.log(obj.num); // 7 | cs |
__proto__ 접근자 프로퍼티를 사용하여 [[Prototype]] 내부에 간접적으로 접근이 가능하지만 권장하지 않는 방법입니다
__proto__ 대신
프로토타입의 참조를 불러오고 싶은경우 Object.getPrototypeOf();
프로토타입을 변경하고 싶은 경우 Object.getPrototypeOf(obj)
을 권장합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 | const obj = {}; const person = { name: 'lee' }; // obj 객체의 프로토타입을 불러옴 console.log(Object.getPrototypeOf(obj)); // [Object: null prototype] {} console.log(obj.name); // undefined // obj 객체의 프로토타입을 person으로 교체 Object.setPrototypeOf(obj, person); // 교체된 obj 객체의 프로토타입을 불러옴 console.log(Object.getPrototypeOf(obj)); // { name: 'lee' } console.log(obj.name); // lee | cs |
함수 객체의 프로토타입 프로퍼티
함수와 클래스 객체만이 prototype 프로퍼티를 가집니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class IsClass {} const func = function () {}; const isInstance = new IsClass(); const isObj = { }; // 클래스 console.log(IsClass.hasOwnProperty('prototype')); // true // 함수 console.log(func.hasOwnProperty('prototype')); // true // 인스턴스 console.log(isInstance.hasOwnProperty('prototype')); // false // 객체 console.log(isObj.hasOwnProperty('prototype')); // false | cs |
다만 함수중에 화살표함수와 메서드 축약표현으로 정의한 메서드는 prototype 프로퍼티가 없으며 프로토타입도 생성하지 않습니다
정리
constructor: 함수 선언문, 함수표현식, 클래스 = prototype 프로퍼티가 있다.
non-constructor: 메서드, 화살표 함수 = prototype 프로퍼티가 없다.
생성자함수는 생성자함수의 자식에게 prototype를 할당하고
생성자 함수의 자식은 __proto__을 가지며 자식의 __proto__는 부모의 prototype를 가리킵니다
구분 | 소유 | 값 | 사용주체 | 사용목적 |
__proto__ 접근자 프로퍼티 |
모든 객체 | 프로토타입의 참조 | 모든 객체 | 객체가 자신의 프로토타입에 접근 또는 교체하기 위해 사용 |
prototype 프로퍼티 |
constructor | 프로토타입의 참조 | 생성자 함수 | 생성자 함수가 자신의 생성할 객체(인스턴스)의 프로토타입을 할당하기 위해 사용 |
'JavaScript' 카테고리의 다른 글
Promise의 기능과 필요한 이유 (0) | 2022.10.19 |
---|---|
프로토타입 체인 (0) | 2022.09.22 |
객체지향 프로그래밍이란? (1) | 2022.09.21 |
클래스와 인스턴스 (0) | 2022.09.21 |
함수란? (0) | 2022.09.20 |