# 네이티브 프로토타입

# Object.prototype

let obj = {};
alert( obj ); // "[object Object]" ?
1
2

[object Object] 가 나오는 이유는 문자열로의 형변환에서 toString 메서드 때문이라는 것은 알고 있다. 그렇다면 toString 메서드는 어디 있을까?

image

let obj = {};

alert(obj.__proto__ === Object.prototype); // true
// obj.toString === obj.__proto__.toString == Object.prototype.toString

alert(Object.prototype.__proto__); // null
1
2
3
4
5
6

# 다른 내장 프로토타입

image

let arr = [1, 2, 3];

// arr은 Array.prototype을 상속받았나요?
alert( arr.__proto__ === Array.prototype ); // true

// arr은 Object.prototype을 상속받았나요?
alert( arr.__proto__.__proto__ === Object.prototype ); // true

// 체인 맨 위엔 null이 있습니다.
alert( arr.__proto__.__proto__.__proto__ ); // null

alert(arr); // 1,2,3 <-- Array.prototype.toString 의 결과
1
2
3
4
5
6
7
8
9
10
11
12

image

# 네이티브 프로토타입 변경하기[#native-prototype-change]

String.prototype.show = function() {
  alert(this);
};

"BOOM!".show(); // BOOM!
1
2
3
4
5
  • 프로토타입은 전역으로 영향을 미치기 때문에 프로토타입을 조작하면 충돌이 날 가능성이 높다.
  • 폴리필을 만들때 프로토타입의 변경을 허용한다.

폴리필

  • 자바스크립트 명세서에는 정의되어 있으나
  • 특정 자바스크립트 엔진에서는 해당 기능이 구현되어있지 않을 때 사용함.
if (!String.prototype.repeat) { // repeat이라는 메서드가 없다고 가정합시다
  // 프로토타입에 repeat를 추가

  String.prototype.repeat = function(n) {
    // string을 n회 반복(repeat)합니다.

    // 실제 이 메서드를 구현하려면 코드는 더 복잡해질겁니다.
    // 전체 알고리즘은 명세서에서 확인할 수 있겠죠.
    // 그런데 완벽하지 않은 폴리필이라도 충분히 쓸만합니다.
    return new Array(n + 1).join(this);
  };
}

alert( "La".repeat(3) ); // LaLaLa
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 프로토타입에서 빌려오기

let obj = {
  0: "Hello",
  1: "world!",
  length: 2,
};

obj.join = Array.prototype.join;

alert( obj.join(',') ); // Hello,world!
1
2
3
4
5
6
7
8
9