Frontend/JS.info 정리

Prototype - 프로토타입 메서드

Creative_Lee 2022. 6. 18. 17:39

1. __proto__ 는 구식입니다.

더는 사용하지 않는 것이 좋습니다.

대신 아래와 같은 모던한 메서드들을 사용하면 좋습니다.

 

  • Object.create( proto, [descriptors] )   - [[Prototype]] 이 proto인  빈 객체를 생성합니다. ( 설명자는 옵션입니다. 
  • Object.getPrototypeOf( obj )               - obj의 [[Prototype]] 을 리턴합니다.
  • Object.setPrototypeOf( obj, proto )    - obj의 [[Prototype]] 을 proto로 설정합니다.
let animal = {
  walk : true
}

let human = Object.create(animal)
console.log(human.walk) // true
console.log(Object.getPrototypeOf(human) === animal) // true

Object.setPrototypeOf(human, null)
console.log(human.walk) // undefined

 

Object.create 메소드에는 프로퍼티 설명자를 전달 할 수 있습니다.

설명자를 이용해 새 객체에 프로퍼티 추가가 가능합니다.

let animal = {
  walk : true
}

let human = Object.create(animal , {
  think : {
    value : true,
  }
})

console.log(human.think) // true
console.log(human.walk) // true

 


[[Prototype]] 은 언제나 얻거나 설정할 수 있지만,

보통의 경우 객체를 생성할 때만 설정하고 이후에 수정하지 않습니다.

Object.setPrototypeOf 나 obj.__proto__  를 사용해서 프로토타입을 동적으로 바꾸는 연산은 

객체 프로퍼티 접근 관련 최적화를 망치기 때문에 성능에 나쁜영향을 미칩니다.

고로 바꾸지 마세요!


2. __proto__는 Object.prototype의 접근자 프로퍼티 입니다.

__proto__ 는 객체의 프로퍼티가 아닙니다.

__proto__ 는 [[Prototype]] 에 접근하기 위한 수단이지 그 자체가 아닙니다.

obj.__proto__ 를 읽거나 쓸때는 이에  대응하는 getter, setter 가 prototype객체에서 호출됩니다.


3. very plain / pure dictionary 객체 

__proto__ 를 평범함 데이터 프로퍼티 처럼 사용하고 싶을 때, 프로토타입이 없는 빈 객체를 만듭니다.

Object.create( null ) 로 객체를 만들면 __proto__ getter, setter 를 상속받지 않습니다.

null을 상속받기 때문에 내장 메서드를 사용할 수 없습니다.

 

이런 객체를 아주 단순한 , 순수 사전식 객체 라고 부릅니다.


요약

1. 사용자가 키를 직접 만들 수 있게 허용한 경우에서  입력한 키가 "__proto__" 일 때 처럼

    __proto__ 는 문제를 일으킬 여지가 있다.

 

2. 이를 방지하기 위해 Object.create( null ) 을 사용할 수 있다.

3. __proto__는 구식이며 이를 대체할 모던한 메소드가 있다.

   Object.create( proto, [ discriptor ] )

   Object.getPrototypeOf ( obj )

   Object.setPrototypeOf ( obj , proto )

 

 

 

전진