Как объектно-ориентированный язык (JS на основе объекта), важно реализовать наследование, но, поскольку не существует концепции самого класса, он не будет реализовать наследование через классы, такие как настоящий объектно-ориентированный язык программирования, но может реализовать наследство с помощью других методов. Есть много способов реализовать наследование, и следующие из них лишь некоторые из них.
1. Прототип цепочки наследования
function person () {// Унаследованная функция называется супертипом (родительский класс, базовый класс) this.name = 'mumu'; this.age = '18 '; } Person.prototype.name = 'susu'; // Когда имя атрибута одинаково, вам нужно быть ближайшим, сначала поиск в экземпляре, но затем перейдите к прототипу, чтобы найти функциональный работник () {// Унаследованная функция называется подтипом (подкласс, полученный класс) this.job = 'student'; } Worker.Prototype = new Person (); // Унаследован через цепочку прототипа, экземпляр объекта, созданный супертипом, присваивается атрибуту прототипа подкласса var p2 = new Worker (); console.log (p2.name); console.log (p2 ancessionof object); // ture Все конструкторы унаследованы от объектаКлюч к реализации наследования выше: Worker.prototype = new Person (); Сделайте прототип работника примером человека и наследуйте его через цепочку прототипа.
ПРИМЕЧАНИЕ. При использовании прототиповых цепей для реализации наследования вы не можете использовать объектные литералы для создания методов прототипа, потому что это прерывает отношения и переписывает цепочку прототипа.
Прототип цепочки проблемы наследования:
1. Существует проблема обмена ссылками, и они по -прежнему разделяют то же пространство, и подкласс будет повлиять на родительский класс.
function person () {this.bodys = ['eye', 'foot']; } функциональный рабочий () {} рабочий. var p1 = new Worker (); p1.bodys.push ('hand'); var p2 = new Worker (); console.log (p1.bodys); console.log (p2.bodys);2. При создании экземпляров подтипов параметры не могут быть переданы в супертипе конструкторы.
Итак, как решить две проблемы цепочки прототипа? Затем продолжайте смотреть на метод наследования ниже ~
2. Заимствование конструктора наследования (также называемого подражанием объекта, кованого объекта или классического наследования)
Функция человека (имя, возраст) {this.name = name; this.age = возраст; this.bodys = ['eye', 'foot']; } Person.prototype.showname = function () {console.log (this.name); } функциональный работник (имя, возраст, job) {person.call (это, имя, возраст); this.job = job; // подкласс добавить атрибуты} var p1 = новый работник ('mumu', '18', 'student'); p1.bodys.push ('hand'); var p2 = new Worker (); console.log (p1.name); console.log (p2.bodys); console.log (p1.showname ());Краткий анализ приведенного выше принципа использования заимствованных конструкторов: person.call (это, имя, возраст); Этот код вызывает родительский конструктор, наследует родительский атрибут и использует метод вызова, чтобы вызвать конструктор человека, чтобы изменить его при выполнении функции. Здесь этот-> новый-это метод замаскированного работника объекта: передайте работника человеку выше.
Когда эталонный тип помещается в конструктор, он не будет обмен, поэтому P2 не затронут.
Заимствование метода наследования конструктора здесь решает проблему, что цепочка прототипа не может пройти параметры и обмениваться типами эталон.
Советы: Call () и Apply () Методы могут изменить объем выполнения функции, короче говоря, изменить содержимое, на которое указано этой функцией.
Оба call () и Apply () Примите два параметра: первым является область применения функции, работающей в ней, а другой - это пропущенный параметр.
Разница между вызовом и применением - это разница в параметрах.
Параметры в вызове должны быть перечислены один за другим.
Параметры применения должны быть массивами или аргументами объектов
Итак, вопрос: почему результат p1.showname () неправ? ---- Потому что метод наследования заимствования конструкторов может наследовать только атрибуты и методы в конструкторе. Здесь мы также находим проблему заимствования конструкторов.
ПРИМЕЧАНИЕ. Поскольку мы помещаем все методы в конструктор, каждый раз, когда мы создаем экземпляры, мы будем выделять пространство памяти для отходов ресурсов, поэтому мы обычно помещаем методы в прототип и атрибуты в конструктор.
Заимствование проблемы наследования конструктора:
Поскольку заимствование конструктора может только наследовать свойства и методы в конструкторе, методы, определенные в прототипе супертипа, невидимы для подкласса, поэтому он эквивалентен отсутствию прототипа. В результате все методы могут быть определены только в конструкторе, поэтому не существует мультиплексирования функции.
Итак, как решить проблему, вызванную заимствованием конструкторов? Тогда это зависит от следующего метода наследования
3. Комбинированное наследование (псевдоклассическое наследование)
Функция человека (имя, возраст) {this.name = name; this.age = возраст; } Person.prototype.showname = function () {console.log (this.name); } функциональный работник (имя, возраст, job) {person.call (это, имя, возраст); // заимствовать конструктор this.job = job; } Worker.prototype = new Person (); // Прототип цепочка наследования var p1 = новый работник ('mumu', '18', 'студент'); console.log (p1.age); p1.showname ();Комбинация наследования: объединение цепи прототипа с заимствованным конструктором.
Идея: используя цепочку прототипа для реализации наследования атрибутов и методов на прототипе и заимствовав конструктор для реализации наследования атрибутов экземпляра
Приведенный выше пример Person.call (это, имя, возраст); заимствует конструктор на наследование атрибутов
Worker.prototype = new Person (); прототип цепочка наследует метод, избегает недостатков двух, объединяет их преимущества и становится наиболее часто используемой моделью наследства.
Проблемы наследования комбинации:
Конструктор Supertype называется дважды, один раз при создании прототипа подтипа, а другое время внутри конструктора подтипа.
Чтобы решить эту проблему, мы должны использовать наследование паразитической комбинации.
4. Прототип наследование
функция объекта (proto) {function f () {} f.prototype = proto; вернуть новый f (); } var person = {name: 'mumu', друзья: ['xiaxia', 'susu']}; var oreperson = object (человек); sitherperson.friends.push ('wen'); var ityanotherperson = Object (человек); sitherperson.friends.push ('tian'); console.log (person.friends); // ["xiaxia", "susu", "wen", "tian"] console.log (другой человек .__ Proto __) // Object {name: "mumu", друзья: Array [4]}}}}}}}}}}}}}}}}}}}}}}Краткий анализ: объект функции (Proto) является временной ретрансляционной функцией, параметр Proto в IT представляет объект, который должен быть передан. Конструктор f () является временным недавно созданным объектом, который используется для хранения передаваемого объекта. F.prototype = proto; Назначьте экземпляр объекта объекту прототипа конструктора F и, наконец, верните экземпляр объекта передаваемого объекта. Прототип наследования или обмена атрибутами эталонных типов.
5. Паразитическое наследование
// объект временного транзита (Proto) {function f () {} f.prototype = proto; вернуть новый f (); } // Функция паразита create (proto) {var f = object (proto); f.love = function () {return this.name; } return f; } var person = {name: 'mumu', друзья: ['xiaxia', 'susu']}; var oreperson = create (человек); console.log (inome person.love ()); Паразитарная комбинация наследования6. Паразитарная комбинация наследования
функция объекта (proto) {function f () {} f.prototype = proto; вернуть новый f (); } // Функция паразита create (человек, работник) {var f = object (person.prototype); // Создать объект f.constructor = работник; // Регулировать указатель построения прототипа и улучшить объектный работник. this.age = возраст; } Person.prototype.showname = function () {console.log (this.name); } функциональный работник (имя, возраст, job) {person.call (это, имя, возраст); this.job = job; } create (человек, работник); // Комбинация паразитов наследование var p1 = новый человек ('mumu', '18', 'студент'); p1.showname ();Этот метод также является наиболее совершенным и идеальным способом реализации методов наследования сейчас.
Вышеуказанные JavaScript Nogitance Notes [должны читать для начинающих] - это весь контент, разделенный редактором. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.