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 )
'Frontend > JS.info 정리' 카테고리의 다른 글
class - class extends (상속) (0) | 2022.06.21 |
---|---|
class - class 기본 문법 (0) | 2022.06.20 |
Prototype - 내장 객체의 프로토타입 (0) | 2022.06.18 |
Prototype - 함수의 prototype 프로퍼티 (0) | 2022.06.17 |
Prototype - 프로토타입 상속 (0) | 2022.06.17 |