# 네이티브 프로토타입
# Object.prototype
let obj = {};
alert( obj ); // "[object Object]" ?
1
2
2
[object Object]
가 나오는 이유는 문자열로의 형변환에서 toString
메서드 때문이라는 것은 알고 있다.
그렇다면 toString
메서드는 어디 있을까?
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
2
3
4
5
6
# 다른 내장 프로토타입
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
2
3
4
5
6
7
8
9
10
11
12
# 네이티브 프로토타입 변경하기[#native-prototype-change]
String.prototype.show = function() {
alert(this);
};
"BOOM!".show(); // BOOM!
1
2
3
4
5
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
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
2
3
4
5
6
7
8
9