강좌 & 팁
안녕하세요. 송기석입니다.
곧 설날이 옵니다. 고향 가시는 길 무사고로 다녀오시기를 바랍니다.
저번 주에는 프로토타입에 대하여 했습니다. 이번 주는 기본 타입에 기능 추가를 하겠습니다. 원래는 저번 주에 이 주제를 하려고 했는데 예제가 프로토타입에 대한 내용이 들어 있어 프로토타입을 모르면 이해하기 어렵다는 생각에 프로토타입부터 했습니다.
기본 타입에 기능 추가
일단 예제부터 보겠습니다.
Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }
위와 같이 method 메소드를 Function.prototype에 추가하면 이후 모든 함수에서 이 메소드를 사용할 수 있고 메소드를 추가할 때 ptototype 속성 이름을 사용할 필요가 없습니다.
그럼 이를 어떻게 사용하는지 예를 보겠습니다. 자바스크립트에는 정수형이 따로 없습니다. 때때로 숫자형에서 정수부분만 추출해야 하는 경우가 생깁니다. 이 문제를 다음과 같이 Number.prototype에 integer 메소드를 추가 해서 해결할 수 있습니다.
Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; } Number.method('integer', function() { return Math[this < 0 ? 'ceiling': 'floor'](this); }); console.log((10 / 3).integer()); // 3
다른 예로 자바스크립트에서는 문자열의 양 끝에 있는 문자열을 지우는 메소드가 없지만 다음과 같이 추가해서 사용할 수 있습니다.
Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; } String.method('trim', function() { return this.replace(/^\s+|\s+$/g, '');; }); console.log(" neat "); // " neat " console.log(" neat ".trim()); // "neat"
이러한 방법으로 언어의 능력을 높일 수 있습니다. 하지만 기본 타입의 프로토타입은 public 구조입니다. 그러므로 다음과 같이 존재하지 않는 메소드만 추가하는 방법을 사용하여 라이브러리들을 섞어 사용할 때 방어적인 방법을 사용하는 것이 좋습니다.
Function.prototype.method = function (name, func) { if(!this.prototype[name]) { this.prototype[name] = func; return this; } }
모두들 즐거운 설날이 되시기를 기원합니다.