객체_네이티브_프로토타입

네이티브 프로토타입#

Object.prototype#

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

[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

다른 내장 프로토타입#

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 의 결과

image

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

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

폴리필

  • 자바스크립트 명세서에는 정의되어 있으나
  • 특정 자바스크립트 엔진에서는 해당 기능이 구현되어있지 않을 때 사용함.
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

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

let obj = {
0: "Hello",
1: "world!",
length: 2,
};
obj.join = Array.prototype.join;
alert( obj.join(',') ); // Hello,world!
Last updated on