JavaScript

[JavaScript] 자바스크립트 내장 객체의 prototype

FRDYtheme 2022. 12. 16. 10:17

빈 객체를 생성하면 이 객체의 [[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(); // 네이티브 프로토타입에 메서드 추가

 

일반적인 상황에서의 사용은 권장하지 않으며 폴리필을 구현해서 내장 프로토타입에 추가할 때만 사용하도록 하자.