객체지향3. prototype의 특징 몇가지

최문길·2023년 11월 4일
1

JavascriptES6

목록 보기
12/23

1. prototype은 constructor 함수에만 비밀리에 생성됩니다.

우리가 object, array 만들어도 prototype이 없다.

var obj = {name:'is'}
console.log(obj.prototype)// undefined

var arr = [1,2,3] 
console.log(arr.prototype)// undefined

2. 내 부모님 유전자를 찾고 싶다면 __proto__를 출력해보시면 됩니다.

부모로부터 생성된 자식 object들은 __proto__라는 속성이 있습니다.

이걸 출력해보시면 부모의 prototype이 출력됩니다.

그래서   __proto__는 부모의 prototype'과 같은 의미입니다. 
function 기계(){
  this.name = 'Kim';
  this.age = 30;
}
var 사람 = new 기계();
console.log(사람 .__proto__);
console.log(기계.prototype);

/*
사람.__proto__

기계.prototype

각각 출력해보시면 똑같은게 나온다.

 "__proto__는 부모 prototype을 의미한다" 

그냥 __proto__는
내 부모 유전자가 뭔지 유전자 검사하고 싶을 때 
쓸 수 있는 그런 값이라고 생각하자 
*/

3. __proto__를 직접 등록하면 object끼리 상속기능을 구현가능합니다.= (__proto__을 이용해 부모님 강제 등록하기)

child.__proto__ = parent
사용 방법

var parent = {name : 'kim'}
var child = {};
child.__proto__ = parent;

console.log(child.name)// kim

이런식으로도 상속기능 구현 할 수 있을것 이다.


4. 궁금해서 해본것들

Q .obj1을 obj2의 부모로 강제 등록해주면 obj1.prototype이 있을 까?

var obj1 = { name : 'kim'}
var obj2 = {}
obj2.__proto__ = obj1;

// 부모로 등록해줬으면 혹시 prototype이 찍힐까?
console.log(obj1.prototype) // undefined 안나옴;

A. undefined 나온다. 역시 constructor에서만 뿅 생기나봄


Q. 왜 안나오지??

var obj1 = { name : 'kim'}
var obj2 = {}
obj2.__proto__ = obj1;
obj1.age = 30;

console.log(obj2) // {} 빈 객체가 나온다. 어?? 잠만..

// obj2.name이라고 한번 해보자
console.log(obj2.name) // 'kim'
console.log(obj2.age) // 30

A. obj2가 안나오지만 obj2.name || obj2.age 를 console 출력 하면 나온다.
이유는

  1. obj2 자체에 없으면
  2. obj2의 부모유전자를 검색
  3. obj1에 'name','age'값이 있으니 그것을 출력해줌

0개의 댓글