Если вы действительно не можете понять некоторые знания в то время, вы можете отпустить это на время и оставить их в будущем, и, возможно, вы сможете понять это.
Несколько месяцев назад у меня было «JavaScript Advanced Programming (третье издание)», и после того, как я пожевал объект, я начал жевать наследство. Однако после жевания прототипов я действительно не мог ее выдержать, и мой разум становился все более и более грязным, поэтому я отбросил ее в сторону и продолжал смотреть на последнюю. Теперь, когда я использовал эти летние каникулы, чтобы понять это наследство, я разберу свои заметки.
Прототип цепочек
Давайте сначала прочитаем статью. Автор статьи очень хорош и оснащен фотографиями высокой четкости. ржу не могу…
Ссылка: [Примечания исследования] Посмотреть цепочку прототипов JS с небольшой точки зрения
Несколько слов из исходного текста
Определить взаимосвязь между прототипом и экземпляром
Есть два способа обнаружения взаимосвязи между прототипом и экземпляром:
Encestionof: определяет, является ли объект экземпляром другого объекта
Механизм внутренних вычислений экземпляра заключается в следующем:
functionInstance_of (l, r) {// l представляет левое выражение, R представляет собой правое выражение varo = r.prototype; // Принять прототип дисплея r l = l .__ Proto__; // возьмите неявный прототип L while (true) {if (l === null) returnfalse; if (o === l) // Здесь точка: когда o строго равен l, вернуть Truereturntrue; L = l .__ Proto__; }}Приведенный выше код выдержек из: подробный анализ оператора экземпляра JavaScript
isprototypeof (): проверяет, существует ли объект в цепочке прототипа другого объекта
Пожалуйста, обратитесь к различиям между этими двумя методами: javaScript iSprototypeof vs экземпляр использования
Используйте только цепочку прототипа для достижения наследования
Недостатки: 1. Атрибуты прототипа, относящиеся к значению типа, будут переданы экземпляром; 2. При создании экземпляра подтипа параметры не могут быть переданы в конструктор SuperType.
functionfather () {this.name = "Отца"; this.Friends = ['aaa', 'bbb'];} functionson () {} son.prototype = newfather (); son.prototype.constructor = son; vars1 = newson (); vars2 = newson (); constrog (s1.name); Отецконсоль.log (s2.name); // fathers1.name = "son"; console.log (s1.name); // sonconsole.log (s2.name); // patherconsole.log (s1.friends); // ["aaa", "bbb"] Консоль. "BBB"] s1.friends.push ('ccc', 'ddd'); console.log (s1.friends); // ["aaa", "bbb", "ccc", "ddd"] console.log (s2.friends); // [AAA "," BBB "," CCC "," DDD "?Используйте только конструкторы для достижения наследования
Метод реализации: вызовите конструктор Supertype внутри конструктора подтипа (с использованием методов Apply () и call ())
Преимущества: решить проблему ссылки на атрибуты типа в прототипе, а подклассы могут передавать параметры в суперкласс
Недостатки: экземпляры подкласса не могут получить доступ к методам, определенным в прототипе родительского класса (SuperClass), поэтому невозможно поговорить о повторном использовании функций.
functionfather (имя, друзья) {this.name = name; this.friends = friends;} отец.prototype.getName = function () {returnThis.name;}; function (имя) {// Примечание: чтобы гарантировать, что отцовый конструктор не переопределяет свойства Сон -конструктора, поместите код, который вызывает отцовский конструктор, прежде чем у власти деформируется в соответствии с лицами. STATHER.Call (это, имя, ['aaa', 'bbb']); this.age = 22;} vars1 = newson ('son1'); vars2 = newson ('son2'); console.log (s1.name); // son1console.log (s2.name); son2s1.friends.push ('ccc', 'ddd'); console.log (s1.friends); // ["aaa", "bbb", "ccc", "ddd"] console.log (s2.friends); // ["aaa", "bbb"]///// подкласс. // typeError: s1.getName не является функциями2.getName (); // typeError: s2.getName не функцияКомбинация наследования
Метод реализации: используйте цепочку прототипа для реализации наследования свойств и методов прототипа, а также используйте конструктор для реализации наследования свойств экземпляра.
functionFather (имя, друзья) {this.name = name; this.friends = friends;} phost.prototype.money = "100k $"; pather.prototype.getname = function () {console.log (this.name);}; functionson (имя, возраст) {// Унаследовать свойство родительского класса);}; functionson (имя, возраст) {// Chole.call (это, имя, ['aaa', 'bbb']); this.age = age;} // наследуют свойства и методы в прототипе родительского класса Son.prototype = newfather (); son.prototype.constructor = son; son.prototype.getage = function () {console.log (this.age); = Newson ('son1', 12); s1.friends.push ('ccc'); console.log (s1.friends); // ["aaa", "bbb", "ccc"] console.log (s1.money); // 100k $ s1.getName (); // son1s1.getage (); // 12vars2 = Newson ('son2', 24); console.log (s2.friends); // ["aaa", "bbb"] console.log (s2.money); // 100k $ s2.getname (); // son2s2.getage (); // 24Комбинированное наследование позволяет избежать дефекта одностороннего использования прототипов цепочек или конструкторов для реализации наследования, объединяет их преимущества и становится наиболее часто используемой моделью наследования в JavaScript, но также является ошибочным, и дефект комбинации наследования будет определенным образом упомянуто позже.
Прототипальное наследование
Идея реализации: используйте прототипы для создания новых объектов на основе существующих объектов, без создания пользовательских типов из -за этого.
Для достижения этого вводится следующая функция (OBJ)
functionObj (o) {functionf () {} f.prototype = o; returnnewf ();} varperson1 = {name: "percy", друзья: ['aaa', 'bbb']}; varperson2 = obj (person1); person2.name = "zyj"; percyconsole.log (person2.name); // zyjconsole.log (person1.friends); // ["aaa", "bbb", "ccc"] console.log (person2.friends); // ["aaa", «BBB», «CCC»] ECMASCRING Normarcte Prototype Inhrehipe Inhrehare Unheriates By -n. В случае передачи параметров, методы Object.Create () и obj () ведут себя так же. varperson1 = {name: "percy", друзья: ['aaa', 'bbb']}; varperson2 = obj zyjconsole.log (person1.friends); // ["aaa", "bbb", "ccc"] console.log (person2.friends); // ["aaa", "bbb", "ccc"]Это наследование может быть выбрано, когда нет необходимости мобилизовать конструктор для его создания, но просто хочу, чтобы один объект оставался похожим на другой.
Паразитическое наследование
Паразитическое наследование - это идея, тесно связанная с прототипом наследования.
Идея реализации: создайте функцию, которая используется только для инкапсуляции процесса наследования, который внутри каким -то образом улучшает объект и, наконец, возвращает объект.
functionObj (o) {functionf () {} f.prototype = o; returnnewf ();} functionCreatePerson (Original) {// инкапсуляции процесса наследования varClone = obj (Original); // Создать объектный клон.showsomThing = function () {// Улучшение объекта console.log ("Hello World!"); }; returnclone; // return object} varperson = {name: "percy"}; varperson1 = createperson (человек); console.log (person1.name); // percyperson1.showsomething (); // Привет, мир!Паразитарная комбинация наследования
Давайте сначала поговорим о недостатках нашего предыдущего наследства комбинации. Самая большая проблема с наследством комбинации состоит в том, что независимо от ситуации, конструктор родительского класса будет называться дважды: один - при создании прототипа подкласса, а другой - при вызове конструктора подкласса, конструктор родительского класса называется внутри конструктора подкласса.
functionFather (имя, друзья) {this.name = name; this.friends = friends;} phost.prototype.money = "100k $"; pather.prototype.getname = function () {console.log (this.name);}; functionson (имя, возраст) {// Унаследовать свойство родительского класса);}; functionson (имя, возраст) {// Отца.Первый вызов делает прототип подкласса экземпляром родительского класса, так что прототип подкласса получает атрибут экземпляра родительского класса; Второй вызов приведет к атрибуту экземпляра подкласса также получить атрибут экземпляра родительского класса; А атрибут экземпляра подкласса будет блокировать атрибуты, которые по умолчанию дублируются с прототипом подкласса. Следовательно, после этих двух вызовов, ненужные атрибуты появляются в прототипе подкласса, вводя тем самым паразитарное наследство для решения этой проблемы.
Идея паразитической комбинации наследования заключается в том, что нет необходимости вызывать конструктор родительского класса, чтобы указать прототип подкласса. Все, что нам нужно, это копия прототипа родительского класса.
По сути, это использование паразитического наследования, чтобы наследовать прототип родительского класса, а затем вернуть результат в прототип ребенка класса.
functionObj (o) {functionf () {} f.prototype = o; returnnewf ();} functionInheritprototype (son, отец) {varprototype = obj (отец. // Улучшение Object Son.prototype = Prototype; // return object} functionfather (имя, друзья) {this.name = name; this.friends = friends;} pather.prototype.money = "100k $"; отца. Отец. this.age = age;} // наследуют свойства и методы в прототипе родительского класса inheritprototype (son, отец); son.prototype.getage = function () {console.log (this.age);}; vars1 = newson ('son1', 12); s1.fushs ('cccc'); console. ["aaa", "bbb", "ccc"] console.log (s1.money); // 100k $ s1.getName (); // son1s1.getage (); // 12vars2 = Newson ('son2', 24); console.log (s2.friends); // ["aaa", "bbb"] console.log (s2.money); // 100k $ s2.getname (); // son2s2.getage (); // 24Преимущества: создание прототипов подкласса избегает наследственных ненужных свойств экземпляра в родительском классе.
Разработчики обычно считают, что паразитарное комбинаторное наследование является наиболее идеальным методом наследования, основанным на наследованиях типа.
наконец
Наконец, я очень рекомендую две очень жесткие статьи
JavaScript, как на самом деле работает прототипическое наследование
Псевдо -классическая схема наследования JavaScript (необходимость пересечь стену)
Сделайте тяжелую картину со второй статьи:
Прочитав это, я понимаю цепочку прототипа за несколько секунд. Есть что -нибудь?
Выше приведено сбор информации, унаследованной JavaScript. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за поддержку этого сайта!