представлять
Любое программирование предлагает повторное использование кода. В противном случае, если вам нужно писать новую программу каждый раз, когда вы разрабатываете новую программу или писать новую функцию, то это будет пустая трата. Тем не менее, повторное использование кода также хорошее или плохое. В следующих двух статьях мы обсудим повторное использование кода. Первая статья избегает использования этих моделей как можно больше, потому что она вызывает некоторые проблемы в большей или меньшей степени; Второй ряд - это рекомендация, которая относится к рекомендуемому шаблону, который каждый использует, и обычно не будет никаких проблем.
Режим 1: режим по умолчанию
Часто возникает проблема с повторным использованием кода режима по умолчанию, обычно используемому всеми. В этом режиме используется конструктор Parent () для создания объекта и назначения объекта прототипу Child (). Давайте посмотрим на код:
Кода -копия выглядит следующим образом:
Функция наследуя (C, P) {
C.prototype = new P ();
}
// родительский конструктор
Функция Parent (имя) {
this.name = имя || 'Адам';
}
// добавить функцию скажем в прототип
Parent.prototype.say = function () {
вернуть это. name;
};
// дочерний конструктор пуст
Функция Child (имя) {
}
// Выполнить наследство
наследовать (ребенок, родитель);
var Kid = new Child ();
console.log (kid.say ()); // "Адам"
var kiddo = new Child ();
Kiddo.name = "Патрик";
console.log (kiddo.say ()); // "Патрик"
// недостатки: вы не можете передать параметры в детском конструкторе
var s = новый ребенок ('seth');
console.log (s.say ()); // "Адам"
Недостатком этого режима является то, что ребенок не может передавать параметры, что в основном бесполезно.
Шаблон 2: конструктор заимствования
Эта схема заключается в том, что ребенок заимствует конструктор родителя, чтобы применить, а затем передает на это и параметры ребенка в метод применения:
Кода -копия выглядит следующим образом:
// родительский конструктор
Функция Parent (имя) {
this.name = имя || 'Адам';
}
// добавить функцию скажем в прототип
Parent.prototype.say = function () {
вернуть это. name;
};
// дочерний конструктор
Функция Child (имя) {
Parent.apply (это, аргументы);
}
var Kid = новый ребенок ("Патрик");
console.log (kid.name); // "Патрик"
// недостатки: метод SAK не унаследован от конструктора
console.log (typeof Kid.say); // "неопределенный"
Недостаток также очевиден, и метод скака не доступен, потому что он не был унаследован.
Образец 3: Заимствуйте конструктор и установите прототип
В двух вышеупомянутых режимах есть свои недостатки, так как удалить недостатки обоих? Давайте попробуем:
Кода -копия выглядит следующим образом:
// родительский конструктор
Функция Parent (имя) {
this.name = имя || 'Адам';
}
// добавить функцию скажем в прототип
Parent.prototype.say = function () {
вернуть это. name;
};
// дочерний конструктор
Функция Child (имя) {
Parent.apply (это, аргументы);
}
Child.prototype = new Parent ();
var Kid = новый ребенок ("Патрик");
console.log (kid.name); // "Патрик"
console.log (typeof Kid.say); // функция
console.log (kid.say ()); // Патрик
Console.dir (Kid);
Удалить Kid.name;
console.log (kid.say ()); // "Адам"
Когда он работает, все нормально, но вы заметили, что родительский конструктор был выполнен дважды, поэтому, хотя программа доступна, она очень неэффективна.
Режим 4: Общий прототип
Общий прототип означает, что ребенок и родитель используют тот же прототип, код заключается в следующем:
Кода -копия выглядит следующим образом:
Функция наследуя (C, P) {
C.Prototype = P.Prototype;
}
// родительский конструктор
Функция Parent (имя) {
this.name = имя || 'Адам';
}
// добавить функцию скажем в прототип
Parent.prototype.say = function () {
вернуть это. name;
};
// дочерний конструктор
Функция Child (имя) {
}
наследовать (ребенок, родитель);
var Kid = новый ребенок ('Патрик');
console.log (kid.name); // неопределенный
console.log (typeof Kid.say); // функция
Kid.name = 'patrick';
console.log (kid.say ()); // Патрик
Console.dir (Kid);
Конечно, что то же самое верно, параметры ребенка не принимаются правильно.
Шаблон 5: временный конструктор
Сначала заимствуйте конструктор, затем установите прототип ребенка на экземпляр заимствованного конструктора и, наконец, восстановите конструктор прототипа ребенка. Код заключается в следующем:
Кода -копия выглядит следующим образом:
/* Закрытие*/
var inherit = (function () {
var f = function () {
};
возврат функции (c, p) {
F.prototype = p.prototype;
C.prototype = new f ();
C.Uber = P.Prototype;
C.prototype.constructor = c;
}
} ());
Функция Parent (имя) {
this.name = имя || 'Адам';
}
// добавить функцию скажем в прототип
Parent.prototype.say = function () {
вернуть это. name;
};
// дочерний конструктор
Функция Child (имя) {
}
наследовать (ребенок, родитель);
var Kid = new Child ();
console.log (kid.name); // неопределенный
console.log (typeof Kid.say); // функция
Kid.name = 'patrick';
console.log (kid.say ()); // Патрик
var Kid2 = новый ребенок ("Том");
console.log (kid.say ());
console.log (kid.constructor.name); // Ребенок
console.log (kid.constructor === Parent); // ЛОЖЬ
Проблема все же, ребенок не может получать параметры обычно.
Режим 6: Klass
Начнем с кода для этого шаблона:
Кода -копия выглядит следующим образом:
var klass = function (parent, props) {
var Child, f, i;
// 1.
// новый конструктор
Child = function () {
if (Child.Uber && Child.Uber.hashownProperty ("__ construct")) {
Child.Uber .__ Construct.Apply (это, аргументы);
}
if (child.prototype.hashownproperty ("__ construct")) {
Child.prototype .__ construct.apply (это, аргументы);
}
};
// 2.
// Наследование
Родитель = родитель || Объект;
F = function () {
};
F.prototype = parent.prototype;
Child.prototype = new f ();
Child.Uber = Parent.Prototype;
Child.prototype.constructor = ребенок;
// 3.
// Добавить метод реализации
для (я в реквизите) {
if (props.hashownproperty (i)) {
Child.protototype [i] = реквизит [i];
}
}
// вернуть "класс"
Возвращение ребенка;
};
var man = klass (null, {
__construct: function (что) {
console.log ("Constructor");
this.name = что;
},
getName: function () {
вернуть это. name;
}
});
var First = new Man ('Adam'); // журналы "Человеческий конструктор"
first.getName (); // "Адам"
var superman = klass (man, {
__construct: function (что) {
console.log ("Конструктор Супермена");
},
getName: function () {
var name = superman.uber.getname.call (this);
вернуть "I Am Am" + имя;
}
});
var clark = new Superman ('Clark Kent');
clark.getName (); // "Я Кларк Кент"
console.log (экземпляр Clark Man); // истинный
console.log (экземпляр Супермена Кларка); // истинный
Как насчет этого? Немного головокружение, чтобы увидеть? Чтобы быть хорошим, грамматика и спецификация этого шаблона такие же, как и другие языки. Вы готовы использовать его? кашель. Полем Полем
Суммировать
Хотя вышеупомянутые шесть режимов реализуют определенные функции в определенных особых обстоятельствах, у всех есть свои недостатки, поэтому в целом каждый должен избегать их использования.