10. 상속 재고
JavaScript 상속과 생성자의 프로토 타입에 대한 설명은 상속과 생성자의 프로토 타입 을 참조하십시오.
JavaScript에서는 상속이 항상 사용할 수 있지만,이 페이지의 예에서는 ECMAScript 5에 도입 된 방법을 일부 사용합니다. 그들이 에뮬레이트 할 수 있는지에 대해서는 각 메소드 개별 페이지를 참조하십시오.
예
B 는 A 로부터 상속 할 것이다 :
function A (a) { this . varA = a; } A.prototype = { varA : null , doSomething : function () { / / ... } } function B (a, b) { A.call ( this , a); this . varB = b; } B.prototype = Object.create ( new A () { varB : {value : null , enumerable : true , configurable : true , writable : true } doSomething : {value : function () { / / 재정 A.prototype.doSomething.apply ( this , arguments); / / 상위 호출 / / ... } enumerable : true , configurable : true , writable : true } }) var b = new B (); b.doSomething ();
여기에서는 다음 사항이 중요합니다 :
형은 . prototype 에서 정의됩니다.
상속하는 Object.create () 를
사용합니다.
prototype 과 Object.getPrototypeOf
Java 나 C + +를 경험해온 개발자 JavaScript는 모두 동적이며 모든 실행시 결정, 그리고 클래스가 전혀 존재하지 않기 때문에 다소 혼란 언어입니다. JavaScript는 단순히 모든 인스턴스 (객체)입니다. "클래스"를 시뮬레이션하는 것조차 단순한 함수 개체입니다.
이미 인식하고있을 수도 있지만, function A 는 prototype 이라는 특별한 속성을 가지고 있습니다. 이 특별한 속성은 JavaScript의 new 와 함께 일하고 있습니다. 프로토 타입 객체에 대한 참조는 새로운 인스턴스의 내부에있는 [Prototype] 속성에 복사됩니다. 예를 들면 var a1 = new A () 는 처리를 할 때, JavaScript (개체를 메모리에 만든 후, 그리고 그 객체를 this 에 정의 A () 를 실행하기 전에)에 a1 [[Prototype] ] = A.prototype 을 설정합니다. 그리고 인스턴스의 속성에 액세스 할 때, JavaScript은 객체에 그들이 직접 존재하고 있는지 확인합니다. 존재하지 않는 경우 [Prototype] 를 참조합니다. 이것은 prototype 에 정의 된 모든 내용이 모든 인스턴스에서 효율적으로 공유되는 것을 의미합니다. 또한 필요에 따라 prototype 의 일부를 나중에 변경하거나 변경을 존재하는 모든 인스턴스에 반영 할 수 있습니다.
앞의 예에서 var a1 = new A (); var a2 = new A (); 를 실행했을 때, a1.doSomething 는 실제로 Object.getPrototypeOf (a1) doSomething 를 참조하고, 이것은 A.prototype . doSomething 과 같습니다. 즉 Object.getPrototypeOf (a1) doSomething == Object.getPrototypeOf (a2). doSomething == A.prototype.doSomething 입니다.
간단히 말해, prototype 은 형을위한 것이며, 한편 Object.getPrototypeOf () 는 인스턴스와 같습니다.
[Prototype] 는 재귀 적 으로 참조됩니다. 즉 a1.doSomething , Object.getPrototypeOf (a1) doSomething , Object.getPrototypeOf (Object.getPrototypeOf (a1)). doSomething 같이, doSomething 이 발견되거나 Object.getPrototypeOf 가 null을 반환 할 때까지 계속합니다.
따라서 다음과 같이 호출 할 때 :
var O = new Foo ();
JavaScript는 실제로는 다음과 같이 실행합니다 :
var O = new Object (); o [[Prototype] = Foo.prototype; o.Foo ();
(혹은 유사한 어떠한 처리합니다) 또한 그 다음 작업을 할 때 :
o.someProp;
JavaScript는 o 가 someProp 을 가지고 있는지 확인합니다. 없는 경우 Object.getPrototypeOf (o). someProp 확인하고 여기에없는 경우 Object.getPrototypeOf (Object.getPrototypeOf (o)). someProp 확인 등과 같이 작동합니다.
저작권 공지
이 문서의 모든 저작권은 Mozilla.org에 있습니다. 이 문서는 "모질라
기여자"들에 의해 작성 되었습니다.
원문 보기
저희가 한글로 번역한 2차적저작물에 대한 저작권 역시 Mozilla.org에
있습니다.