Говоря о наследстве класса JavaScript, неизбежно, что цепочка прототипа не может быть разделена, но наследование только через цепочку прототипа имеет много недостатков.
Проблема наследования без параметров
Давайте сначала рассмотрим кусок образца кода для реализации наследования B из:
Кода -копия выглядит следующим образом:
функция a () {
}
A.prototype.a1 = function () {};
функция b () {
}
B.Prototype = новый a ();
B.prototype.b1 = function () {};
var b = new b ();
предупреждение (B.Constructor == A); // истинный
предупреждение (B.Constructor == B); // ЛОЖЬ
Основные проблемы с этим кодом:
1. A должен быть создан как прототип B, а в настоящее время конструктор A выполняется. Однако, согласно объектно-ориентированным правилам, B и его родительский класс A не должны выполняться до создания создания B.
2. Изменил прототип B, что привело к тому, что B.Constructor не B, но A.
Есть проблема с наследством класса женьшеня
Предположим, что 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 в качестве прототипа B происходит исключение:
Кода -копия выглядит следующим образом:
S1 не определен
Решение
Область S1 и S2 находится только в B. Чтобы передать их A, вы можете работать только в B. Это может быть достигнуто с помощью метода применения функции:
Кода -копия выглядит следующим образом:
Функция B (S1, S2) {
A. Применить (это, аргументы);
предупреждение (this.totallength);
}
Следующий вопрос - как добавить метод A к прототипу B. Это не сложно, просто пройдите через A.Prototype и скопируйте метод в B.Prototype. Следует отметить, что для методов с тем же именем подклассы являются естественными предпочтительными (перегруженными), поэтому они не могут быть переопределены:
Кода -копия выглядит следующим образом:
для (var m в A.prototype) {
if (! B.Prototype [M]) {// Методы родительского класса не могут переопределить подклассы
B.Protototype [M] = A.Prototype [M];
}
}
PostScript
Учитывая, что языки высокого уровня, такие как C# и Java, отказались от множественного наследства, в этой статье обсуждается ситуация одиночного наследования. Метод наследования, описанный в этой статье, также будет написан как расширение Jraiser и будет опубликован позже.