JavaScript의 클래스 상속에 대해 말하면, 프로토 타입 체인을 분리 할 수는 없지만 프로토 타입 체인을 통한 상속은 많은 단점이 있습니다.
매개 변수가없는 상속 문제
먼저 A에서 B 상속을 구현하기 위해 샘플 코드를 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
기능 a () {
}
A.prototype.a1 = function () {};
함수 b () {
}
B. prototype = 새로운 a ();
b.prototype.b1 = function () {};
var b = 새로운 b ();
경고 (b.constructor == a); // 진실
경고 (b.constructor == b); // 거짓
이 코드의 주요 문제는 다음과 같습니다.
1. A는 B의 프로토 타입으로 인스턴스화되어야하며 현재 A의 생성자가 실행됩니다. 그러나 객체 지향 규칙에 따라 B와 그 부모 클래스 A는 B를 인스턴스화하기 전에 실행해서는 안됩니다.
2. B의 프로토 타입을 변경하여 B가 아닌 B.constructor가 A를 초래했습니다.
Ginseng 클래스 상속에 문제가 있습니다
A와 B에 두 개의 문자열 매개 변수 S1과 S2가 있다고 가정합니다. A는 두 줄의 총 길이를 계산하고 B는 A를 매개 변수로 S1과 S2로 직접 호출합니다.
코드 사본은 다음과 같습니다.
함수 A (S1, S2) {
this.totallength = s1.length + s2.length;
}
a.prototype.a1 = function () {
};
함수 B (S1, S2) {
}
B. prototype = 새로운 a ();
b.prototype.b1 = function () {
};
새로운 B ( "ab", "123");
보시다시피,이 코드에서 S1과 S2를 A로 전달하는 방법이 없으며 B의 프로토 타입으로 A를 인스턴스화 할 때 매개 변수가 없기 때문에 예외가 발생합니다.
코드 사본은 다음과 같습니다.
S1은 정의되지 않았습니다
해결책
S1과 S2의 범위는 B로만 있습니다. A로 전달하려면 B에서만 작동 할 수 있습니다. 기능의 적용 메소드를 사용하여 달성 할 수 있습니다.
코드 사본은 다음과 같습니다.
함수 B (S1, S2) {
A. 적용 (이것은 인수);
경고 (this.totallength);
}
다음 질문은 방법 A를 프로토 타입 B에 추가하는 방법입니다. 어렵지 않습니다. A.prototype를 통해 방법을 B. prototype에 복사하십시오. 동일한 이름을 가진 메소드의 경우 서브 클래스가 자연스럽게 선호 (과부하)되므로 재정의 할 수 없습니다.
코드 사본은 다음과 같습니다.
for (a.prototype의 var m) {
if (!
B. prototype [m] = A. 프로로 타입 [M];
}
}
추신
C# 및 Java와 같은 고급 언어가 다중 상속을 포기했다는 점을 고려할 때, 단일 상속의 상황은이 기사에서 논의됩니다. 이 기사에 설명 된 상속 방법은 Jraiser의 확장으로 작성되며 나중에 공개됩니다.