В этой статье суммируется использование JavaScript при наследстве. Поделитесь этим для вашей ссылки. Детали следующие:
пример:
Скопируйте код следующим образом:/**
* Подклассы реализации наследуют родительский класс, но не генерируют ненужные свойства и методы
* @returns {function}
*/
определить (function () {
Функция возврата (subtype, supertype) {
var proto = новый объект (supertype.prototype);
proto.constructor = subtype;
subtype.prototype = proto;
};
});
// -
определить (function () {
Функциональный остря (ы)
{
this.str = s;
this.length = this.strength;
}
ostring.prototype.show = function () {
оповещение (this.str);
};
вернуть Остря;
});
// -
Определить (['nehrit', 'stastring'], function (наследство, острая) {
функция Wstring (s) {
// Использовать вызов для конструктора родительского класса
ostring.call (this, s);
this.chlength = 2 * s.length;
}
// наследуют другие атрибуты
наследовать (WSTRING, Ostring);
wstring.prototype.add = function (w)
{
предупреждение (this.str + w);
};
вернуть wstring;
});
Посмотрите на пример еще раз
1. Используйте функцию для реализации:
Скопируйте код следующим образом: Function Person (name) {
this.name = name;
}
Person.prototype.getName = function () {
вернуть это. name;
}
Автор функции (имя, книги) {
this.inherit = человек;
this.inherit (имя);
this.books = книги;
}
var au = new Author ("Dororo", "Learn Mouce");
au.name
Или эквивалент:
Скопируйте код следующим образом: Function Person (name) {
this.name = name;
}
Person.prototype.getName = function () {
вернуть это. name;
}
Автор функции (имя, книги) {
Person.call (это, имя);
this.books = книги;
}
var au = new Author ("Dororo", "Learn Mouce");
au.getName
Поскольку это просто воспринимает это как параметр, вызывая конструктор лица родительского класса и присваивая все домены, назначенные родительскому классу, подклассу автора, любые домены, определенные вне родительского конструктора лица, не будут унаследованы. Таким образом, в приведенном выше примере au.getName не будет определено (неопределенное), потому что GetName определяется в объекте прототипа личного прототипа.
Более того, конструктор подкласса должен вызвать конструктор родительского класса, прежде чем определять свой собственный домен, чтобы не перезаписать определение подкласса родительским классом. Другими словами, автор определяет книгу недвижимости после человека. В противном случае она будет перезаписана собственностью лично. В то же время лучше не использовать прототип для определения функциональной области подкласса в подклассах, потому что после того, как подкласс является новым и созданным экземпляром, должен быть выполнен прототип, а затем называется конструктор родительского класса, который также легко перезаписать родительские атрибуты.
2. Используйте прототип для реализации:
Скопируйте код следующим образом: Function Person (name) {
this.name = name;
}
Person.prototype.getName = function () {
вернуть это. name;
}
Автор функции (имя, книги) {
this.books = книги;
}
Author.prototype = новый человек (имя);
Author.prototype.constructor = автор;
Author.prototype.getbooks = function () {
вернуть это. книги;
}
var au1 = новый автор ("dororo1", "Learn My More");
var au2 = новый автор ("dororo2", "учиться меньше");
Alert (au1.getName ());
Alert (au2.getName ());
Этот метод избегает проблемы, что прототип не может быть унаследован в реализации функции. Потому что Author.Prototype = New Person (имя); экземпляр New Person () вызовет все свойства конструкции лица и прототипа. Но недостаток в том, что автор. Прототип был создан. Таким образом, когда подклассы создаются, все типы данных, не являющихся базой, являются эталонными копиями. Таким образом, в приведенном выше примере значение, возвращаемое примером AU1 или AU2, является Dororo1.
3. Используйте «гибрид» для достижения
Скопируйте код следующим образом: Function Person (name) {
this.name = name;
}
Person.prototype.getName = function () {
вернуть это. name;
}
Автор функции (имя, книги) {
this.base = новый человек (имя);
for (var key in this.base) {
if (! this [key]) {
это [key] = this.base [key];
}
}
this.book = книги;
}
var au1 = новый автор ("dororo1", "работа");
var au2 = новый автор ("dororo2", "Play");
Alert (au1.getName ());
Alert (au2.getName ());
au1.book;
au2.book;
Он принадлежит расширению, скопируйте все домены родительского класса в подкласс. В двух вышеуказанных аспектах нет проблем.
Режим паразитической комбинации)
Наследство JS включает в себя наследование атрибутов и наследование методов, которые реализованы различными методами.
1. Наследование атрибутов
Наследование атрибутов достигается путем изменения среды выполнения функции. Среда выполнения изменения функции может быть реализована с использованием двух методов: call () и Apply ().
Сначала мы создаем животное «класс» (потому что нет концепции класса в JS, вот просто макет, на самом деле это просто объект функции функции).
Скопируйте код следующим образом: Function Animal (typename) {
// Добавить имени типна свойства для среды выполнения текущего метода (это)
// но среда выполнения (это) должна быть выполнена, прежде чем она может быть определена
this.typename = typename;
this.colors = ["red", "while"];
}
// Я хочу добавить два (общих объекта) метода в прототип функции
Animal.prototype.shout = function () {alert ("i am: -" + this.typename);};
Animal.prototype.eat = function () {alert ("i am: -" + this.typename)};
//-Определите лев-«класс» (на самом деле функция)
Функция Lion (TN) {
//-выполнить метод животных и изменить среду выполнения животных на этот лев через первый параметр применения
// Аналогично, Лев это должно быть выполнено, чтобы определить, кто это
Animal.Apply (это, ["Lion"]); //-наследует переменные атрибуты родительского класса, это потому, что это новый лев, это лев
}
Lion.Prototype = Animal.Prototype; // наследуют метод родительского класса и сделать его готовым, но это не очень хорошо написано. Когда детский класс добавляет метод, родительский класс также имеет этот метод. Это ссылка на указатель
Lion.prototype.hunt = function () {
оповещение ("Я: Лев, я хочу охотиться ~~ ・ ~");
}
var aminm = new Animal ();
aminm.hunt (); // --- Вы можете получить доступ к методу подкласса, который не очень хорош
// ---- Так как решить эту проблему? ? ? ? ? ?
// --- Решение: Вы можете написать это при наследстве метода:
Lion.Prototype = new Animal (); // Унаследовать метод родительского класса и назначить объект животного прототипу прототипа. На самом деле, в нем также есть атрибуты.
var lion = new Lion (); // Помимо создания нового ключевого слова, оно также изменит среду выполнения объекта Lion к самому объекту Lion
//-Другими словами, после завершения нового, это в функции льва является самой функцией льва, а затем функция льва вызывается
Проанализируйте новые ключевые слова:
Новое ключевое слово очень великолепно. В предыдущем коде новое ключевое слово выполняет следующие задачи:
1) Откройте пространство кучи для подготовки к хранению объектов львов
2) Измените среду выполнения самого объекта Lion так, чтобы эта функция Lion указывала на сам объект функции Lion.
3) Назовите «конструктор» класса Lion «и создайте объект льва
4) Назначьте адрес объекта функции Lion функции Lion с переменной L, а в это время L указывает на объект функции Lion
Lion.shout ();
Lion.eat ();
Тем не менее, это наследство имеет недостаток: конструктор родительского класса называется дважды, вызовите один раз, а затем снова новый.
Я надеюсь, что эта статья будет полезна для каждого программирования JavaScript.