상속은 객체 지향 프로그래밍을 구현할 때 매우 중요한 수단입니다. 비록 우리는 상속 대신 더 많은 조합을 상속하고 사용할 수 없다고 말하지만, 상속은 항상 불가피합니다. 우리가 여기서 논의하고 싶은 것은 JavaScript의 상속 메커니즘입니다.
실제로 JavaScript에는 상속 개념이 없지만 몇 가지 수단을 통해 모방 할 수 있습니다. 이 상속은 실제로 한 객체를 다른 객체로 복사합니다. 모든 지역 및 호스트 클래스는 주로 보안 고려 사항을 위해 기본 클래스로 상속받을 수 없습니다.
JavaScript에는 약 3 가지 범주의 상속이 있습니다. 1. 물체 가장; 2. 프로토 타입 상속; 3. 둘의 혼합.
1. 대상의 모방
실제로, 객체 가장자리는이 키워드와 밀접한 관련이 있습니다 (따라서이 키워드를 JavaScript : P)에서 완전히 이해하는 것이 중요합니다. 생성자는이를 사용하여 속성 및 메소드에 값을 할당하고 생성자는 일반 함수로 간주 될 수 있으므로 서브 클래스의 기본 클래스 A 생성자의 생성자를 만들 수있는 다음 서브 클래스 내부 에서이 함수를 호출 할 수 있으며 서브 클래스는 모기 클래스의 속성 및 메소드를 얻습니다.
원칙은 매우 간단하므로 어떻게 구현합니까? 코드 예제를 사용하여 실제 작업을 수행하겠습니다.
구현 방법 1 객체 가장 , 가장 일반적으로 사용되는 새 개체 생성 방법의 구현 방법 :
코드 사본은 다음과 같습니다.
var classa = function (name) {
this.name = 이름;
this.alertName = function () {
경고 (this.name);
}
}
var classb = 함수 (이름, 나이) {
this.myconstructor = classa;
this.myconstructor (이름);
this.myconstructor;
this.age = age;
this.alertage = function () {
경고 (this.age);
}
}
위의 방법이 올바른지 확인하려면 직접 테스트 할 수 있습니다. 아래 테스트에 사용 된 코드를 작성하겠습니다.
코드 사본은 다음과 같습니다.
var obja = 새로운 classa ( 'dk');
obja.alertName (); // dk
var objb = new classb ( 'ds', 20);
objb.alertName (); // ds
objb.alertage (); // 20
이것을 대상 적과라고합니다. 또한, 객체 가장를 구현하는 다른 두 가지 방법이 있습니다. 구현 방법은 다르지만 원칙은 동일합니다.
객체 가장 인행 구현 방법 2 , 통화 방법 사용 :
코드 사본은 다음과 같습니다.
var classa = function (name) {
this.name = 이름;
this.alertName = function () {
경고 (this.name);
}
}
var classb = 함수 (이름, 나이) {
classa.call (this, name);
this.age = age;
this.alertage = function () {
경고 (this.age);
}
}
또한 첫 번째 방법에서는 코드를 통해 새로운 함수 포인터를 만들어서 부모 클래스를 가리키고 함수라고 말한 다음 포인터를 삭제한다는 것을 알 수 있습니다. 여기서 우리는 호출 방법을 사용 하여이 객체에서 상위 클래스의 생성자를 실행하여 동일한 목적을 달성합니다. 또한 호출 방법은 적용 메소드입니다.
객체 가장자리 구현 방법 3 , 적용 방법을 사용하십시오.
코드 사본은 다음과 같습니다.
var classa = function (name) {
this.name = 이름;
this.alertName = function () {
경고 (this.name);
}
}
var classb = 함수 (이름, 나이) {
classa.apply (this, new Array (이름));
this.age = age;
this.alertage = function () {
경고 (this.age);
}
}
실제로, 적용 메소드는 매개 변수가 약간 다르다는 점을 제외하고는 호출 메소드와 매우 유사하다는 것을 알 수 있습니다.
2. 프로토 타입 상속
모든 사람은 프로토 타입 객체를 이해해야합니다. 프로토 타입 객체의 모든 속성과 방법은 클래스의 모든 인스턴스로 전달됩니다. 부모 클래스의 모든 속성과 방법은 아동 클래스의 프로토 타입 객체에 지불되며, 이는 상속을 실현하는 것과 같습니다.
서브 클래스가 상위 클래스의 모든 속성과 방법을 얻으려면 부모 클래스의 인스턴스를 서브 클래스의 프로토 타입 객체에 직접 지불합니다. 그렇다면 우리의 서브 클래스는 부모 클래스의 모든 객체와 방법을 얻는 것과 같지 않습니까?
코드 샘플 서비스 :
코드 사본은 다음과 같습니다.
var classa = function () {
this.name = 'dk';
this.alertName = function () {
경고 (this.name);
}
}
var classb = 함수 (이름, 나이) {
this.name = 이름;
this.age = age;
}
classb.prototype = new classa ();
classb.prototype.alertage = function () {
경고 (this.age);
}
여기서 부모 클래스의 생성자는 매개 변수가 없는지 확인해야합니다. 생성자 매개 변수가 있더라도 프로토 타입 상속을 구현할 때 패스 할 수없는 =. =.
3. 혼합 상속
이름에서 알 수 있듯이 하이브리드 상속은 처음 두 가지 방법의 혼합 사용입니다.
코드 사본은 다음과 같습니다.
var classa = function (name) {
this.name = 이름;
}
classa.prototype.alertName = function () {
경고 (this.name);
}
var classb = 함수 (이름, 나이) {
classa.call (this, name);
this.age = age;
}
classb.prototype = new classa ();
classb.prototype.alertage = function () {
경고 (this.age);
}
객체를 사용하여 가장자리를 사용하면 매개 변수를 상위 클래스로 전달하고 프로토 타입 상속을 사용하면 공개 방법에 대한 상속을 구현합니다.
이 세 가지 영역의 상속 방법에 대해 이야기 한 후 아래의 문제에 대해 이야기 할 차례입니다.
당신은 당황 스러울 수 있습니다. 왜 대상 사칭과 프로토 타입 상속과 혼합 상속을 만들어야합니까? 예, 가장 중요한 것은이 질문입니다.
1. 실제로 테스트하면 객체 가장에 의해 구현 된 상속은 부모 클래스의 프로토 타입 체인의 메소드에 액세스 할 수 없다는 것을 알게 될 것입니다.
2. 프로토 타입을 상속하면 모든 속성을 공유 속성으로 바꿀 수 있습니다. 동일한 서브 클래스에서 두 인스턴스를 구현하면 모든 인스턴스가 모든 속성을 공유한다는 것을 알게됩니다.
3. 그러나 이것은 확실히 부적절합니다. 따라서 하이브리드 상속 방법이있어 속성이 비공개 상태를 유지하고 서브 클래스가 부모 클래스의 프로토 타입 체인에 액세스 할 수 있도록합니다.
직접 시도해 볼 수 있습니다. 객체가 상속을 가장하는 경우 서브 클래스는 부모 클래스의 프로토 타입 체인 방법에 액세스 할 수 없습니다. 프로토 타입 체인 상속 하위 클래스의 모든 인스턴스는 모든 상위 클래스 속성을 공유합니다. 나는 여기에 예제를 쓰지 않을 것입니다.