삼삼고
꿈꾸는 삼삼고
삼삼고
전체 방문자
오늘
어제
  • 분류 전체보기 (179)
    • 후기 (95)
      • 코딩부트캠프 (90)
      • 취업 준비 기간 (5)
    • 백엔드 (20)
      • django (1)
      • 네트워크 (13)
      • 익스프레스 (0)
      • 그래프QL (2)
      • sqlite3 (1)
    • 프론트 엔드 (49)
      • javascript (21)
      • css (6)
      • react (8)
      • HTML (5)
      • UI&UX (8)
    • experience (1)
    • python (1)
    • project (1)
    • CS (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코드스테이츠 세션 후기
  • http://www.tcpschool.com/ajax/ajax_basic_node
  • django 첫걸음
  • 출처

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
삼삼고

꿈꾸는 삼삼고

[JavaScript]Prototype & Prototype chain
프론트 엔드/javascript

[JavaScript]Prototype & Prototype chain

2022. 9. 24. 17:15

❓What Is Prototype?

 사람은 유전자를 통해서 자신들의 유전 정보를 자식들에게 넘겨줄 수 있다. 

👉javascript에서 유전자 역할을 하는 것은 prototype이다. 모든 객체는 prototype object를 가지고 있고 이를 통해 부모 객체의 정보를 가져올 수 있다.

👇아래 코드예시를 보고 이해해보자!
function neko(){
	this.color = 'black';
	this.gender = 'male';
}

neko.prototype.name = 'chco'


const Neko = new neko();

// Neko = { color:'black', gender:'male'}
// Neko.name = 'chco'
/*이렇게 생성된 오브젝트는 name을 직접 가지지는 않지만*/
/*부모가 가진 정보를 가져올 수 있다.*/

 

console.dir을 통하면 오브젝트의 데이터 값을 살펴볼수 있습니다..

👇console.dir로 Neko의 데이터 값을 확인해 보자!

Neko에는 neko() 함수의 값과 [[prototype]](인터널 슬롯)과 constructor property(생성자 함수)를 가지고 있다.

👆위에서 넣었던 이름 ' chco'가 [[prototype]] 아래에 위치하고 있음을 알 수 있다.)

 

📌인터널 슬롯(Internal slot)

모든 객체들은 전부 [[Prototype]]이라는 인터널 슬롯(internal slot)을 가지고 있으며 [[Protype]]에는 Prototype 객체의 값을 가지고 있다, [[Prototype]]은 __proto__ accessor property로 접근할 수 있다.
console.log(neko.__proto__ === Function.prototype); //true
//neko함수객체의 부모 역활을 하는 Function.prototype을 가르킴

/*###추가 prototype 프로퍼티(!함수 일때만)
console.log(neko.prototype === Neko.__proto__); //true
함수 객체가 생성자로 사용될 때 이 함수의 부모 역할을 하는 객체(prototype object)를 가리킨다.
*/

 

📌Prototype Link

객체의 __proto__ property로 자신의 부모객체에 접근할 수 있는 속성을 prototype Link라 한다

 

📌Constructor property(생성자 함수)

또한 prototype object의 경우 constructor(생성자) property를 갖게 되는데 이 property는 객체 입장에서 자신이 생성한 객체를 가킨다.
// neko() 생성자 함수에 의해 생성된 객체를 생성한 객체는 neko() 생성자 함수이다.
console.log(neko.prototype.constructor === neko);

// Neko 객체를 생성한 객체는 neko() 생성자 함수이다.
console.log(Neko.constructor === neko);

// neko() 생성자 함수를 생성한 객체는 Function() 생성자 함수이다.
console.log(neko.constructor === Function);

 

🔗Prototype chain

function neko(){
	this.color = 'black';
	this.gender = 'male';
}
neko.prototype.name = 'chco'

//neko의 객체 생성
const Neko = new neko();
new키워드를 이용해서 Neko의 객체 생성 시 prototype Link속성을 통해 상위 프로토타입 간 연결이 이루어진다.

새롭게 생성된 객체 Neko에서 name을 가져오겠습니다.

console.log(Neko.name); //출력 'chco'
Neko객체에는 name이 정의되어 있지 않지만 chco가 출력되었다. 어떻게 가능한 걸까❓

📌Neko 객체의 name에 접근할 때, 해당 객체에게 name가 없다면 그다음으로 상위 프로토타입(원형) 속성에서 name이 있는지 확인한다. 없다면 그것을 찾기 위해 더 상위의 프로토타입(부모)에서 찾는다. 이것을 프로토타입 체인이라고 한다.

📌동일함에도 여러 번 코드가 작성되었을 때. 비효율적이기도 하고, 계속 새로운 변수로 만들어지는 것이므로 성능면에서도 불리할 것이다. 이러한 부분은 prototype chain을 통해 해결할 수 있다.

 

🔩클래스, 프로토타입, 인스턴스의 관계도

 

🔎DOM으로 보는 prototype

📌브라우저에서 DOM을 이용하면, document.createElement('div')로 새로운 div 엘리먼트를 만들 수 있음. 이렇게 생성된 div 엘리먼트는 HTMLDivElement라는 클래스의 인스턴스임

📌위의 EventTarget의 부모로는 모든 클래스의 조상인 Object가 존재이다

📌__proto__  를 이용하면 부모 클래스의 프로토타입, 혹은 '부모의 부모 클래스'의 프로토타입을 탐색할 수 있다
let div = document.createElement('div');

div.__proto__   //HTMLDivElement
div.__proto__.__proto__  // HTMLElement
div.__proto__.__proto__.__proto__  // Element
div.__proto__.__proto__.__proto__.__proto__  //Node
div.__proto__.__proto__.__proto__.__proto__.__proto__ //EventTarget
div.__proto__.__proto__.__proto__.__proto__.__proto__.__proto__  // object

 

❓Property란?❓

property는 어떤 값을 나타냅니다. 그런데 이 값이 다른 값과 연관되어 있을 때 property라고 부릅니다.

예))
=> 문자열에는 length라는 property가 포함되어 있는데 이 프로퍼티는 문자열 안에 있는 문자의 양을 정수로 나타낸 값을 담고 있습니다.
const str = '문자수';

//str문자열 객체의 length 프로퍼티를 출력
console.log(str.length);

//출력된 값
//>3
[출처] [JavaScript] property란 무엇인가?|작성자 AIdev

 

 

728x90
반응형
저작자표시 (새창열림)

'프론트 엔드 > javascript' 카테고리의 다른 글

[JavaScript]비동기 (Asynchoronous)  (0) 2022.10.02
[JavaScript] class의 상속  (0) 2022.09.25
[JavaScript]절차지향vs객체지향  (2) 2022.09.21
[JavaScript]클래스와 인스턴스  (0) 2022.09.21
[JavaScript]고차함수(array.filter, array.map, array.reduce)사용법  (4) 2022.09.21
    '프론트 엔드/javascript' 카테고리의 다른 글
    • [JavaScript]비동기 (Asynchoronous)
    • [JavaScript] class의 상속
    • [JavaScript]절차지향vs객체지향
    • [JavaScript]클래스와 인스턴스
    삼삼고
    삼삼고
    별이 되겠습니다

    티스토리툴바