2. JavaScript 객체 지향 프로그래밍 : 생성자 상속
이 섹션에서는 주로 여러 개체를 "상속"하는 인스턴스를 생성하는 방법을 소개합니다.
예를 들어, 이제 "동물"객체에 대한 생성자가 있습니다.
기능 동물 () {this.species = "동물"; }"고양이"객체 생성자도 있습니다.
기능 고양이 (이름, 색) {this.name = 이름; this.color = 색상; }"고양이"는 어떻게 "동물을 상속"할 수 있습니까?
1. 생성자 결합
가장 쉬운 방법은 아마도 호출 또는 적용 메소드를 사용하여 부모 객체의 생성자를 Child Object에 바인딩하는 것입니다.
함수 고양이 (이름, 색) {동물성 (니라 apply) (this, arguments); this.name = 이름; this.color = 색상; } var cat1 = 새로운 고양이 ( "큰 머리", "노란색"); 경고 (cat1.species); // 동물2. 프로토 타입 모드
보다 일반적인 접근 방식은 프로토 타입 속성을 사용하는 것입니다.
"고양이"의 프로토 타입 객체가 동물 사례를 가리키면 "고양이"의 모든 인스턴스가 동물을 상속받을 수 있습니다.
cat.prototype = new Animal (); cat.prototype.constructor = cat; var cat1 = 새로운 고양이 ( "큰 머리", "노란색"); 경고 (cat1.species); // 동물
코드의 첫 번째 줄에서, 우리는 고양이 프로토 타입 객체를 동물 사례에 지적합니다.
1.cat.prototype = new Animal ();
프로토 타입 객체의 원래 값을 완전히 제거한 다음 새 값을 할당하는 것과 같습니다. 그러나 두 번째 줄은 무엇을 의미합니까?
1.cat.prototype.constructor = cat;
프로토 타입 객체에는 생성자 기능을 가리키는 생성자 속성이 있음이 밝혀졌습니다. 다시 말해, Cat.prototype 객체의 생성자 특성은 CAT를 가리 킵니다.
이전 단계 에서이 프로토 타입 객체의 원래 값을 삭제 했으므로 새 프로토 타입 객체에는 생성자 속성이 없으므로 수동으로 추가해야합니다. 그렇지 않으면 후속 "상속 체인"에 문제가 있습니다. 이것이 두 번째 줄이 의미하는 바입니다.
요컨대, 이것은 매우 중요한 시점이며 프로그래밍 할 때 따라야합니다. 다음은 다음과 같습니다. 프로토 타입 객체가 교체되면
1.o.prototype = {};
그런 다음 다음 단계는 생성자 속성을 새 프로토 타입 객체에 추가 하고이 속성을 원래 생성자 함수로 다시 참조하는 것입니다.
1.O.Prototype.constructor = O;
3. 프로토 타입을 직접 상속합니다
동물 대상에서 변하지 않은 특성은 Animal.prototype에 직접 쓸 수 있습니다. 따라서 CAT ()가 Animal ()를 건너 뛰고 Animal.Prototype를 직접 상속 할 수 있습니다.
이제 동물 대상을 먼저 다시 작성해 봅시다.
1. 기능 장애 동물 () {}
2.animal.prototype.species = "동물";
그런 다음 고양이의 프로토 타입 객체를 가리키고 동물의 프로토 타입 객체를 가리켜 상속이 완료되도록하십시오.
cat.prototype = Animal.Prototype; catcat.prototype.constructor = cat; var cat1 = 새로운 고양이 ( "큰 머리", "노란색"); 경고 (cat1.species); // 동물
이전 방법과 비교할 때, 이것의 장점은 비교적 효율적이며 (동물 사례를 실행하고 만들 필요가 없음) 메모리 절약이 더 많다는 것입니다. 단점은 Cat.Prototype 및 Animal.prototype가 이제 동일한 물체를 가리키므로 Cat.Prototype에 대한 모든 수정이 Animal.prototype에 반영된다는 것입니다.
따라서 위의 코드는 실제로 문제가됩니다. 두 번째 줄을 참조하십시오
1.cat.prototype.constructor = cat;
이 문장은 실제로 동물의 생성자 속성을 변경했습니다.
1. alert (Animal.prototype.constructor); // 고양이
4. 빈 개체를 중개자로 사용하십시오
"프로토 타입의 직접 상속"에는 위의 단점이 있기 때문에 빈 객체를 중개자로 사용할 수 있습니다.
var f = function () {}; f. prototype = Animal.prototype; cat.prototype = new f (); cat.prototype.constructor = cat;F는 빈 객체이므로 거의 메모리를 차지하지 않습니다. 현재 CAT 프로토 타입 물체를 수정하면 동물 프로토 타입 물체에 영향을 미치지 않습니다.
1. alert (Animal.prototype.constructor); // 동물
5. 프로토 타입 모드의 캡슐화 기능
위의 방법을 쉽게 사용하기 위해 함수로 캡슐화합니다.
함수 확장 (child, parent) {var f = function () {}; f. prototype = parent.prototype; child.prototype = new f (); child.prototype.constructor = child; child.uber = parent.prototype; }그것을 사용할 때, 방법은 다음과 같습니다
확장 (고양이, 동물); var cat1 = 새로운 고양이 ( "큰 머리", "노란색"); 경고 (cat1.species); // 동물
이 확장 기능은 Yui 라이브러리가 상속을 구현하는 방법입니다.
또한 설명하겠습니다. 기능 본문의 마지막 줄
1.child.uber = parent.prototype;
이는 Child Object의 Uber 속성을 설정하는 것을 의미하며, 이는 부모 객체의 프로토 타입 속성을 직접 지적합니다. 이것은 자식 객체에 채널을 열고 부모 객체의 방법을 직접 호출하는 것과 같습니다. 이 라인은 상속 완전성을 달성하기 위해 여기에 배치되며 순전히 예비 자산입니다.
6. 상속을 복사하십시오
위의 것은 프로토 타입 객체를 사용하여 상속을 구현하는 것입니다. 우리는 또한 우리의 생각을 바꾸고 "복사"방법을 사용하여 상속을 달성 할 수 있습니다. 간단히 말해서, 부모 객체의 모든 속성과 방법이 Child Object에 복사되면 상속을 달성 할 수 없습니까?
우선, 동물의 변경되지 않은 모든 특성을 프로토 타입 객체에 넣으십시오.
1. 기능 장애 동물 () {}
2.animal.prototype.species = "동물";
그런 다음 재산 복사의 목적을 달성하기 위해 다른 기능을 작성하십시오.
함수 extend2 (child, parent) {var p = parent.prototype; var c = child.prototype; for (p in p) {c [i] = p [i]; } c.uber = p; }이 기능의 기능은 부모 객체의 프로토 타입 객체의 속성을 Child Object의 프로토 타입 객체에 하나씩 복사하는 것입니다.
그것을 사용할 때 다음과 같이 작성하십시오.
Extend2 (고양이, 동물); var cat1 = 새로운 고양이 ( "큰 머리", "노란색"); 경고 (cat1.species); // 동물
위의 기사 JavaScript에서 객체 지향 프로그래밍에 대한 심층적 인 분석은 내가 공유하는 모든 내용입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.