Prototype Object 와 Prototype

황제낙엽 2008.08.08 11:00 조회 수 : 21 추천:94

sitelink1  
sitelink2  
sitelink3  
sitelink4 http://1 
extra_vars4 ko 
extra_vars5 자바 스크립트 for 웹2.0 - 오레일리 
extra_vars6 sitelink1 
1. Object
자바스크립트 객체는 일반적으로 하나의 생성자와 여러 개의 메소드/프로퍼티로 구성된다.
또한 Object라는 자바스크립트 표준 객체로부터 여러 가지 기능을 상속받는다.
Object 자체로는 그다지 흥미롭지 않다. 메소드들은 객체 내의 메소드로 사용되기보다는 점차
전역 함수로 사용되게 되었다. 이러한 것들로 eval이 있다.
Object는 새로운 객체를 생성할 때 프레임워크를 제공한다. 그러나 기존 객체지향 언어에서 제공하는
상속과 클래스의 개념을 통해서 하는 대신 프로토타입이라는 개념을 통해서 객체지향과 유사한 기능을 제공한다.

2. Prototype
일반적인 객체지향 프로그래밍에서는 기존의 클래스를 확장하여 새로운 클래스를 만들면 기존 클래스로부터 상속을 받는다.
그리고 나서 상속받은 기능을 재정의하거나 고유의 기능을 추가하는 수순을 밟는다.
반면에 자바스크립트에서는 Object 생성자를 이용해서 새로운 객체를 만든다. 따라서 새로운 객체와 그 프로퍼티에 메모리를
할당하는 것은 Object 생성자이다.
Object는 prototype프로퍼티도 제공한다. 이를 사용해서 String과 Number 같은 내장 객체는 물론이고 모든 객체를 확장할 수 있다.
즉, 클래스 상속이 아닌 프로토타입을 이용해서 새로운 객체의 메소드와 프로퍼티를 파생한다.
프로토타입으로 객체를 확장하는 개념은 예를 보면 쉽게 이해할 수 있다. [예제]는 Object의 prototype 프로퍼티를 사용해서
String 객체를 확장하고 String 생성자를 사용해서 인스턴스를 생성하는 방법을 보여준다.
추가된 trim 메소드는 문자열에서 앞과 뒤에 있는 공백 문자들을 제거한다.

<script>  
 String.prototype.trim = function() {   
  return (this.replace(/^[sxA0]+/, "").replace(/[sxA0]+$/, ""));   
 }   
    
 var sObj = new String(" This is the string ");   
 sTxt = sObj.trim();   
    
 document.writeIn("--" + sTxt + "--");   
</script>  

prototype 프로퍼티를 사용하여 String 객체에 trim 함수를 추가했기 때문에, 이 라이브러리를 사용하는 페이지 내에서는 기존의 String
객체 메소드/프로퍼티는 물론이고, 새로 추가된 trim 함수도 어디에서나 사용할 수 있다.
즉, 새로운 객체 클래스를 생성한 것이 아니라 기존 객체 클래스의 기능을 확장한 것이다.
바로 이것이 클래스 기반과 프로토타입의 차이점이다.
prototype 프로퍼티를 사용하는 대신, 문자열 인스턴스(변수)에 직접 trim함수를 추가할 수도 있다.

var str = " this is a string ";   
str.trm = function() ...  

그러나 이렇게 하면 인스턴스만 함수에 접근할 수 있기 때문에, prototype을 사용해서 String 객체 자체에 추가해주는 것이 더 좋을 것이다.
자바스크립트의 모든 객체 (사용자 정의 객체도 포함)는 기능을 확장할 수 있도록 prototype 프로퍼티를 갖고 있다.
메소드에 접근할 때, 프로토타입이 어떻게 동작할까? 메소드를 호출하면 자바스크립트 엔진은 해당 메소드를 기본 객체 구현에서 찾는다.
만약 발견되지 않으면 prototype 집합에서 찾고 여기서도 발견되지 않으면 해당 변수에서 찾는다.