객체 지향 언어 (JS는 객체 기반)로서 상속을 구현하는 것이 필수적이지만 클래스 자체의 개념이 없기 때문에 실제 객체 지향 프로그래밍 언어와 같은 클래스를 통해 상속을 구현하지는 않지만 다른 방법을 통해 상속을 구현할 수 있습니다. 상속을 구현하는 방법에는 여러 가지가 있으며 다음은 그 중 일부일뿐입니다.
1. 프로토 타입 체인 상속
function person () {// 상속 된 함수는 SuperType (부모 클래스, 기본 클래스)라고합니다. this.name = 'mumu'; this.age = '18 '; } person.prototype.name = 'susu'; // 속성 이름이 동일 할 때 가장 가까운 경우, 먼저 인스턴스에서 검색해야하지만 기능을 찾으려면 프로토 타입으로 이동하여 기능 worker () {// 상속 된 함수를 하위 유형 (하위 클래스, 파생 클래스)이라고합니다. } worker.prototype = new Person (); // 프로토 타입 체인을 통해 상속되면 SuperType에 의해 인스턴스형 인스턴스 인스턴스 인스턴스는 서브 클래스 var p2 = new Worker ()의 프로토 타입 속성에 할당됩니다. Console.log (p2.name); console.log (p2 인스턴스 객체); // 모든 생성자는 객체에서 상속됩니다위의 상속을 구현하기위한 핵심은 다음과 같습니다. worker.prototype = new Person (); 작업자 프로토 타입을 사람의 인스턴스로 만들고 프로토 타입 체인을 통해 상속하십시오.
참고 : 프로토 타입 체인을 사용하여 상속을 구현할 때는 객체 리터럴을 사용하여 프로토 타입 메소드를 만들 수 없습니다. 관계를 방해하고 프로토 타입 체인을 다시 작성할 수 있기 때문입니다.
프로토 타입 체인 상속 문제 :
1. 참조 공유 문제가 있으며 여전히 동일한 공간을 공유하며 서브 클래스는 상위 클래스에 영향을 미칩니다.
기능인 () {this.bodys = [ '눈', '풋']; } function worker () {} worker.prototype = new Person (); var p1 = 새로운 작업자 (); p1.bodys.push ( 'hand'); var p2 = 새로운 작업자 (); Console.log (P1.Bodys); Console.log (p2.bodys);2. 하위 유형의 인스턴스를 생성 할 때 슈퍼 타입 생성자에서 매개 변수를 전달할 수 없습니다.
그렇다면 프로토 타입 체인의 두 가지 문제를 해결하는 방법은 무엇입니까? 그런 다음 아래의 상속 방법을 계속 살펴보십시오 ~
2. 빌린 생성자 상속 (대상 사칭, 단조 물체 또는 고전적인 상속이라고도 함)
기능인 (이름, 나이) {this.name = 이름; this.age = age; this.bodys = [ '눈', '풋']; } person.prototype.howname = function () {console.log (this.name); } 기능 작업자 (이름, 나이, 직업) {person.call (this, name, age); this.job = job; // 서브 클래스 추가 속성} var p1 = new Worker ( 'mumu', '18', 'Student'); p1.bodys.push ( 'hand'); var p2 = 새로운 작업자 (); Console.log (p1.name); Console.log (p2.bodys); console.log (p1.howname ());빌린 생성자 사용의 위의 원리에 대한 간단한 분석 : person.call (이, 이름, 연령); 이 코드는 부모 생성자를 호출하고, 상위 속성을 상속하고, 호출 방법을 사용하여 개인 생성자를 호출하여 함수가 실행될 때이를 변경합니다. 여기서,이 새로운 것은 작업자 객체 생성자 위장 된 방법입니다. 위의 사람에게 작업자를 전달하십시오.
기준 유형이 생성자에 배치되면 공유되지 않으므로 P2가 영향을받지 않습니다.
생성자 상속 방법을 빌리면 프로토 타입 체인이 매개 변수를 전달하고 참조 유형을 공유 할 수없는 문제를 해결합니다.
팁 : Call () 및 apply () 메소드는 기능 실행 범위를 변경할 수 있습니다. 요컨대,이 기능에 의해 지적 된 내용을 변경할 수 있습니다.
Call () 및 apply () 모두 두 개의 매개 변수를 수락합니다. 첫 번째는 실행중인 함수의 범위이고 다른 하나는 전달 된 매개 변수입니다.
통화와 응용의 차이점은 매개 변수의 차이입니다.
통화의 매개 변수는 하나씩 열거되어야합니다.
적용의 매개 변수는 배열 또는 인수 개체 여야합니다.
문제는 : 왜 p1.howname ()의 결과가 잘못된 것입니까? ---- 생성자를 빌리는 상속 방법은 생성자의 속성과 방법 만 상속 할 수 있기 때문입니다. 여기서 우리는 또한 생성자를 빌리는 문제를 발견합니다.
참고 : 모든 방법을 생성자에 넣으므로 인스턴스화 할 때마다 메모리 공간을 리소스를 낭비하기 위해 할당하므로 일반적으로 프로토 타입과 생성자의 속성에 메소드를 넣습니다.
빌린 생성자 상속 문제 :
생성자를 빌리면 생성자의 특성과 메소드를 물려받을 수 있기 때문에 슈퍼 타입 프로토 타입에 정의 된 방법은 서브 클래스에 보이지 않으므로 프로토 타입이없는 것과 동일합니다. 결과적으로 모든 방법은 생성자에서만 정의 될 수 있으므로 기능이 멀티플렉싱이 없습니다.
빌린 생성자로 인한 문제를 해결하는 방법은 무엇입니까? 그런 다음 다음 상속 방법에 따라 다릅니다
3. 조합 상속 (의사 클래스 상속)
기능인 (이름, 나이) {this.name = 이름; this.age = age; } person.prototype.howname = function () {console.log (this.name); . } worker.prototype = new Person (); // 프로토 타입 체인 상속 var p1 = new Worker ( 'mumu', '18', 'Student'); Console.log (p1.age); p1.howname ();조합 상속 : 프로토 타입 체인과 빌린 생성자를 결합합니다.
아이디어 : 프로토 타입 체인을 사용하여 프로토 타입의 속성 및 메소드 상속을 구현하고 인스턴스 속성의 상속을 구현하기 위해 생성자를 빌려
위의 예제 인 Call (this, name, age); 속성을 상속하기 위해 생성자를 빌립니다
worker.prototype = new Person (); 프로토 타입 체인은이 방법을 상속 받고, 둘의 단점을 피하고, 장점을 결합하며, 가장 일반적으로 사용되는 상속 모델이됩니다.
조합 상속 문제 :
슈퍼 유형 생성자는 하위 유형 프로토 타입을 생성 할 때 한 번, 다른 시간은 하위 유형 생성자 내부에서 두 번 호출됩니다.
이 문제를 해결하려면 기생 조합 상속을 사용해야합니다.
4. 프로토 타입 상속
함수 객체 (proto) {function f () {} f.prototype = proto; 새로운 f ()를 반환합니다. } var person = {이름 : 'mumu', 친구 : [ 'xiaxia', 'susu']}; var atherperson = 객체 (사람); 다른 사람 .Friends.push ( 'wen'); var etanotherperson = 객체 (사람); 다른 사람 .Friends.push ( 'tian'); Console.log (person.friends); // [ "Xiaxia", "Susu", "Wen", "Tian"] Console.log (다른 사람 .__ proto __) // object {name : "mumu", friends [4]}간단한 분석 : 기능 객체 (프로토)는 임시 릴레이 함수이며, 매개 변수 프로토는 통과 할 객체를 나타냅니다. f () 생성자는 통과 된 객체를 저장하는 데 사용되는 임시 새로 생성 된 객체입니다. f. prototype = 프로토; 객체 인스턴스를 F 생성자의 프로토 타입 객체에 할당하고 마지막으로 전달 된 객체의 객체 인스턴스를 반환합니다. 프로토 타입 상속 또는 공유 특성 유형의 속성.
5. 기생 상속
// 임시 대중 교통 함수 객체 (proto) {function f () {} f.prototype = proto; 새로운 f ()를 반환합니다. } // 기생충 함수 create (proto) {var f = object (proto); f.love = function () {return this.name; } 반환 f; } var person = {이름 : 'mumu', 친구 : [ 'xiaxia', 'susu']}; var atherperson = create (person); Console.log (Otherperson.love ()); 기생 조합 상속6. 기생 조합 상속
함수 객체 (proto) {function f () {} f.prototype = proto; 새로운 f ()를 반환합니다. } // 기생충 함수 기능 생성 (person, worker) {var f = 객체 (person.prototyp); // 개체 생성 f.constructor = 작업자; // 프로토 타입 구성 포인터 조정 및 객체 작업자를 향상시키고 객체를 지정} 함수 직원 (name, age) {this.name = name; this.age = age; } person.prototype.howname = function () {console.log (this.name); } 기능 작업자 (이름, 나이, 직업) {person.call (this, name, age); this.job = job; } Create (Person, Worker); // 기생충 조합 상속 var p1 = 새로운 사람 ( 'mumu', '18', 'Student'); p1.howname ();이 방법은 또한 상속 방법을 구현하는 가장 완벽하고 이상적인 방법입니다.
위의 JavaScript 상속 학습 노트 [초보자를 위해 읽어야 함]은 편집자가 공유하는 모든 콘텐츠입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.