빈 객체를 생성하면 이 객체의 [[Prototype]]은 누굴 참조할까
obj = {};
이 코드를 풀어보면
obj = new Object();
이 코드와 같다. 내장 객체 생성자 함수 Object로
생성자 함수를 통해 객체를 생성하면 그 객체의 [[Prototype]]은 생성자 함수의 prototype 프로퍼티를 참조한다.
<script>
obj = {};
alert(Object.getPrototypeOf(obj) === Object.prototype) // true
</script>
배열(Array), 함수(Function), 객체(Object), 날짜(Date) 등의 내장 객체들 모두 상속받는 객체를 위한 메서드를 포함하고 있고, 새로운 배열, 함수, 객체를 생성하면 [[Prototype]]이 되는 내장 객체에서 디폴트 생성자가 동작해서 생성이 된다.
이 과정은 메모리의 효율을 높여주는데 자바스크립트 명세서에 모든 내장 프로토타입의 꼭대기에는 Object.prototype이 있어야 한다고 명시되어 있다.
<script>
console.log(arr.__proto__ === Array.prototype ) // true
console.log(arr.__proto__.__proto__ === Object.prototype) // true
console.log(arr.__proto__.__proto__.__proto__) // null
</script>
객체는 -> 내장객체를 참조하고 -> 내장객체는 최상위의 Object를 참조하는데
이 물고 물리는 체인에는 서로 중복되는 메서드가 있을 수 있으며 중복 메서드가 있으면
호출한 객체에서 가까운 prototype의 메서드를 받아온다.
원시데이터의 prototype?
원시값은 객체가 아니라서 내부 프로퍼티에 접근할 때 내장 생성자 String, Boolean, Number를 사용하는 임시 객체(wrapper)가 생성되는데 이 객체는 보이지 않는 곳에서 만들어지며 엔진에 의해 최적화가 이루어지고 메서드를 전달하고 나면 사라진다. (null, undifined는 wrapper 객체가 없으므로 메서드, 프로퍼티 사용 불가)
원시데이터는 아래 내장객체의 프로토타입을 통해 메서드를 전달받아 사용한다.
- String.prototype
- Number.prototype
- Boolead.prototype
이런 네이티브 프로토타입에 메서드를 추가해서 사용할 수 있지만 프로토타입은 전역으로 영향을 미치기 때문에
충돌이 날 가능성이 높아진다.
String.prototype.use = function(){
console.log('네이티브 프로토타입에 메서드 추가')
};
"사용 권장하지 않는 것:".use(); // 네이티브 프로토타입에 메서드 추가
일반적인 상황에서의 사용은 권장하지 않으며 폴리필을 구현해서 내장 프로토타입에 추가할 때만 사용하도록 하자.
'JavaScript' 카테고리의 다른 글
[JavaScript] matchMedia(), resize(브라우저 사이즈 이벤트) (0) | 2022.12.16 |
---|---|
[JavaScript] 함수 - 재귀와 스택 (0) | 2022.12.16 |
[JavaScript] 함수 프로퍼티 prototype과 객체 [[Prototype]] (0) | 2022.12.15 |
[JavaScript] 접근자 프로퍼티 getter와 setter (0) | 2022.12.15 |
[JavaScript] DOM객체 속성 제어 (0) | 2022.12.14 |