JavaScript는 객체 지향 언어가 아니며 전통적인 상속 방법을 제공하지 않지만 상속을 달성하기 위해 제공하는 프로토 타입 속성을 사용하여 프로토 타입 상속 방식을 제공합니다.
프로토 타입 체인은 JavaScript의 주요 상속 방법입니다.
프로토 타입 체인의 기본 아이디어는 다음과 같습니다. 프로토 타입을 사용하여 하나의 참조 유형이 다른 참조 유형의 특성과 메소드를 물려받을 수 있도록합니다.
생성자, 프로토 타입 및 인스턴스 간의 관계 : 각 생성자에는 프로토 타입 객체가 있고 프로토 타입 객체에는 생성자에 대한 포인터가 포함되어 있으며 인스턴스에는 프로토 타입 객체에 대한 내부 포인터가 포함되어 있습니다.
프로토 타입 객체가 다른 객체의 인스턴스와 같으면 프로토 타입 객체에는 다른 프로토 타입에 대한 포인터가 포함되며, 따라서 다른 프로토 타입에는 다른 생성자에 대한 포인터도 포함되어 있습니다.
프로토 타입 체인 구현 기본 모드 :
함수 superType () {this.property = true;} superType.Protople.GetSuperValue = function () {return this.property;}; function subtype () {this.subProperty = false;} // inherit superTypesubType.prototype = new superType (subtype.get.get. get.get. () {return this.subProperty;}; var instance = new subtype (); alert (instance.getSuperValue ()); // 진실서브 타입은 SuperType의 인스턴스를 생성하고 인스턴스를 subtype.prototype에 할당함으로써 달성 된 SuperType를 상속합니다. 구현의 본질은 프로토 타입 객체를 다시 작성하고 새로운 유형의 인스턴스로 바꾸는 것입니다. 이러한 방식으로, 슈퍼 타입 인스턴스에 원래 존재하는 특성 및 방법은 하위 유형에도 존재한다. 그런 다음 subtype.prototype에 메소드를 추가하여 SuperType의 특성 및 방법을 상속하는 다른 방법을 추가합니다.
위의 예의 인스턴스 관계는 다음과 같이 표현됩니다.
위의 내용은 기본적으로 하위 유형이 제공하는 프로토 타입을 사용하지 않고 대신 새로운 프로토 타입으로 대체합니다. 이 새로운 프로토 타입은 SuperType의 인스턴스입니다. 또한 새 프로토 타입 내에서 슈퍼 타입을 실행하는 프로토 타입에 대한 포인터도 있습니다. 결과적으로, 인스턴스는 슈퍼 타입의 프로토 타입을 가리킨 하위 유형의 프로토 타입을 가리킨다. getValue () 메소드는 여전히 supertype.prototype에 있지만 프로토 타입은 subtype.prototype에 있습니다. 이는 속성이 인스턴스 속성이기 때문에 getSuperValue ()가 프로토 타입 방법이기 때문입니다. 하위 유형. 프로로 타입은 이제 슈퍼 타입의 인스턴스이므로 속성은 자연스럽게 해당 인스턴스에 위치합니다.
참고 : instance.constructor는 이제 하위 유형의 프로토 타입이 다른 객체 인 SuperType의 프로토 타입을 가리키고이 프로토 타입 객체의 생성자 속성이 SuperType을 가리키기 때문에 이제 SuperType을 가리 킵니다.
읽기 모드에서 속성에 액세스 할 때 인스턴스가 먼저 해당 속성을 검색합니다. 속성을 찾을 수없는 경우. 인스턴스의 프로토 타입 검색이 계속됩니다. 프로토 타입 체인을 통해 상속이 달성되면, 검색 프로세스는 프로토 타입 체인을 따라 계속 위로 이동할 수 있습니다.
기본 프로토 타입
모든 참조 유형은 기본적으로 객체를 상속 하고이 상속은 프로토 타입 체인을 통해 구현됩니다. 모든 함수의 기본 프로토 타입은 객체의 인스턴스입니다. 따라서 기본 프로토 타입에는 Object.Prototype에 대한 내부 포인터가 포함됩니다. 그렇기 때문에 사용자 정의 유형이 tostring (), valueof () 등과 같은 메소드를 상속하는 이유입니다.
완전한 프로토 타입 체인 :
상위 상속 시스템에서, 하위 유형은 슈퍼 타입을 물려 받고, 슈퍼 형 객체를 상속한다. instance.toString ()이 호출되면 Object.Prototype에 저장된 메소드가 실제로 호출됩니다.
인스턴스와 프로토 타입의 관계를 결정하십시오
프로토 타입과 인스턴스의 관계를 결정하는 두 가지 방법이 있습니다.
연산자 인스턴스를 사용하십시오
경고 (인스턴스 인스턴스 객체); ALERT (SuperType의 인스턴스 인스턴스); 경고 (인스턴스 인스턴스의 하위 유형);
프로토 타입 체인 간의 관계로 인해 위의 모든 것이 사실입니다.
isprototype () 메소드를 사용하십시오
alert (object.prototype.isprototypof (인스턴스)); Alert (supertype.prototype.isprototypof (인스턴스)); alert (subtype.prototype.isprototypof (instance)); alert (subtype.prototype.isprototypof (instance));
메소드를주의 깊게 정의하십시오
프로토 타입에 메소드를 추가하는 코드는 프로토 타입을 대체하는 명령문 후에 배치해야합니다.
함수 superType () {this.property = true;} superType.Protople.GetSuperValue = function () {return this.property;}; function subtype () {this.subProperty = false;} superType.Prototype = new SuperType (); // add Method.getsubal. this.subproperty;}; // 메소드 subtype.prototype.getSuperValue = function () {return this.subProperty;}; // 메소드 subtype.prototype.getSuperValue = return false;}; instance = new subtype (); alert (); // 거짓위의 예에서 프로토 타입을 SuperType 인스턴스로 교체 한 후 두 가지 방법을 정의한다는 점에 유의해야합니다.
또한 프로토 타입 체인을 통해 상속 할 때 객체 리터럴을 사용하여 프로토 타입 방법을 만들 수 없습니다. 그렇게하기 때문에 프로토 타입 체인을 다시 작성합니다.
함수 superType () {this.property = true;} supertype.prototype.getSuperValue = function () {return this.property;}; function subtype () {this.subproperty = false;} // inherit supertypesubtype.prototype = new supertopte (new superType); Code Invalid subtype.prototype = {getsubvalue : function () {return this.subproperty;}, someothermethod : function () {return false;}}; var instance = new subtype (); alert (instast.getSuperValue ()); // 오류위의 예는 슈퍼 타입 인스턴스를 프로토 타입에 할당 한 다음 프로토 타입을 물체 문자 그럴로 대체합니다. 현재 프로토 타입에는 슈퍼 타입 인스턴스가 아닌 객체 인스턴스가 포함되어 있으며 하위 유형과 슈퍼 타입 사이에는 관계가 없습니다.
프로토 타입 체인 문제
앞에서 언급했듯이, 참조 유형을 포함하는 프로토 타입 속성은 모든 인스턴스에서 공유됩니다. 그렇기 때문에 속성이 프로토 타입 객체가 아닌 생성자에 정의되어야합니다.
함수 superType () {this.colors = [ "빨간색", "blue", "green"];} 함수 subtype () {} subtype.prototype = new supertype (); var instance1 = new subtype (); instance1.colors.push ( "black"); alert (instance1.colors); // "Red", "Blue", "Green", "Black"var instance2 = new subtype (); alert (instance2.colors); // "Red", "Blue", "Green", "Black"위의 예에서, 색상 특성은 배열을 포함하는 슈퍼 타입 생성자에 정의되며, SuperType의 각 인스턴스에는 자체 배열이 포함 된 색상 속성이 있습니다. 서브 타입은 프로토 타입 체인을 통해 슈퍼 타입을 상속 한 후, subtype.prototype은 SuperType의 인스턴스가되므로 자체 색상 속성도 있습니다. 그러나 하위 유형의 모든 사례는이 One Colors 속성을 공유합니다.
또 다른 문제는 모든 객체 인스턴스에 영향을 미치지 않으면 서 매개 변수를 슈퍼 클래스 생성자에게 전달할 수있는 방법이 없다는 것입니다.
위는 편집자가 귀하에게 소개 한 프로토 타입 체인 상속을 기반으로 JavaScript의 관련 지식입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!