Javascript 원형 및 계승(Prototypes and Inheritance)

JavaScript 대상 은 원형 대상(prototype object)에서 속성 을 계승 합 니 다.모든 대상 은 원형 이 있다.원형의 모든 속성 은 그것 을 원형 으로 사용 하 는 대상 의 속성 처럼 보인다.쉽게 말 하면 모든 대상 이 그의 원형 에서 속성 을 계승 한 다 는 것 이다.each object inherits properties from its prototype).대상 의 prototype 은 constructor function 을 통 해 정의 합 니 다.JavaScript 의 모든 function 에는 prototype 속성 이 있 습 니 다.이 속성 은 처음에는 비어 있 었 습 니 다.그 다음 에 그 에 게 추가 한 모든 속성 은 constructor 가 만 든 대상 에 의 해 소유 되 었 습 니 다.prototype 대상 은 constructor 와 연결 되 어 있 습 니 다.이것 은 프로 토 타 입 이 방치 방법 과 다른 상량 의 이상 적 인 장소 가 될 수 있다 는 것 을 의미한다.프로 토 타 입 의 속성 은 새로 만 든 대상 에 복사 되 지 않 습 니 다.그들의 속성 은 대상 의 속성 처럼 보 입 니 다.이 는 원형 을 사용 하면 여러 개의 같은 대상 이 차지 하 는 메모 리 를 대폭 줄 일 수 있다 는 뜻 이다.모든 class 는 하나의 prototype object 만 있 고 속성 을 추가 합 니 다.그러나 우 리 는 실행 할 때 여러 종류의 인 스 턴 스 를 만 들 수 있 습 니 다.그렇다면 원형 속성 에 대한 읽 기와 쓰기 가 발생 하면 어떤 상황 이 벌 어 질 까?속성 을 읽 을 때 자바 스 크 립 트 는 먼저 대상 자체 에 이 속성 이 있 는 지 찾 아 보 세 요.없 으 면 원형 에 있 는 지 찾 아 보 세 요.있 으 면 결과 로 돌아 가.그리고 원형 속성 을 쓸 때 여러 대상 이 원형 을 공유 하기 때문에 원형 에 직접 쓰기 작업 을 할 수 없다.이 럴 때 실제로 자 바스 크 립 트 는 대상 에 같은 이름 의 속성 을 만 들 고 값 을 기록 합 니 다.다음 에 이 속성 을 읽 을 때 자 바스 크 립 트 는 대상 의 속성 에서 단번에 찾 을 수 있 습 니 다.그러면 원형 에서 찾 을 필요 가 없습니다.이때 우 리 는'대상 의 속성 이 원형의 속성 을 덮 거나 숨 겼 다'고 말한다.(shadows or hides) 。 위의 토론 을 통 해 알 수 있 듯 이 사실은 우리 가 디자인 류 를 할 때 하나의 원칙 만 파악 하면 원형 에서 일부 방법(방법 은 일반적으로 변 하지 않 는 다),상수,상수 등 만 정의 할 수 있다.이 정도 면 헷 갈 리 기 쉽 지 않 을 거 야.예:///클래스 에 대한 생 성자 메 서 드 를 정의 합 니 다.////각각 다른 속성 을 초기 화하 기 위해 사용 합 니 다.functionCircle(x,y,r){    this.x = x;  // The X-coordinate of the center of the circle this.y = y;  // The Y-coordinate of the center of the circle this.r = r;  // The radius of the circle } // Create and discard an initial Circle object. // This forces the prototype object to be created in JavaScript 1.1. new Circle(0,0,0); // Define a constant: a property that will be shared by // all circle objects. Actually, we could just use Math.PI, // but we do it this way for the sake of instruction. Circle.prototype.pi = 3.14159; // Define a method to compute the circumference of the circle. // First declare a function, then assign it to a prototype property. // Note the use of the constant defined above. function Circle_circumference(  ) { return 2 * this.pi * this.r; } Circle.prototype.circumference =Circle_circumference; // Define another method. This time we use a function literal to define // the function and assign it to a prototype property all in one step. Circle.prototype.area = function(  ) { return this.pi * this.r * this.r; } // The Circle class is defined. // Now we can create an instance and invoke its methods. var c = new Circle(0.0, 0.0, 1.0); var a =c.area(  ); var p = c.circumference(  ); 내 장 된 클래스 의 prototype.사용자 정의 클래스 뿐만 아니 라 prototype.시스템 내 장 된 클래스,예 를 들 어 String,Date 도 있 습 니 다.그리고 그들 에 게 새로운 방법,속성 등 을 추가 할 수 있다.다음 코드 는 모든 String 대상 에 유용 한 함 수 를 추가 합 니 다://Returns true if the last character is cString.prototype.ends With=function(c){    return(c==this.charAt(this.length-1))}그리고 우 리 는 이와 유사 하 게 호출 할 수 있 습 니 다.var message="hello world"; message.endsWith('h')  // Returns false message.endsWith('d')  // Returns true

좋은 웹페이지 즐겨찾기