Повторное использование кода и его принципы
代码复用, как следует из названия, состоит в том, чтобы повторно использовать часть или даже весь код, который был написан для создания новой программы. Говоря о повторном использовании кода, первое, что мы можем придумать, - это继承性. Принцип повторного использования кода:
优先使用对象组合,而不是类继承В JS, поскольку нет концепции класса, концепция экземпляров не очень значима. Объекты в JS-это простые пары ключей, которые могут быть созданы и модифицированы динамически.
Но в js мы можем создать создание объекта, используя конструкторы и new операторов, которые имеют сходство синтаксиса с другими языками программирования, которые используют классы.
Например:
var trigkit4 = new Person(); js , кажется, является классом при вызове Person , но на самом деле это все еще функция, которая дает нам некоторые идеи развития и модели наследования, которые предполагаются, основанные на классе, которые мы можем назвать «классическими шаблонами наследования».
Традиционная модель наследования требует ключевого слова class . Мы предполагаем, что приведенная выше модель наследования класса является现代继承模式, которая является моделью, которая не должна рассматриваться в классе.
Классический режим наследования
См. Следующие два примера Constructor Parent() и Child() :
<script type="text/javascript">Функция Parent (имя) {
this.name = имя || «Аллен»;
}
Parent.prototype.say = function () {
вернуть это. name;
}
Функция Child (name) {}
// Создать объект с родительским конструктором и назначить объект для прототипа ребенка для достижения наследования
Функция наследуя (C, P) {
C.Prototype = new P (); // Атрибут прототипа должен указывать на объект, а не на функцию
}
// вызов объявленной унаследованной функции
наследовать (ребенок, родитель);
</script>
Когда объект создается с использованием оператора new Child() , он получает свой функциональность от экземпляра Parent() через прототип, например:
var kid = new Child();kid.say();//AllenПрототип цепочка
Давайте обсудим, как прототипные цепи работают в режиме наследования класса. Мы думаем о объектах как о блоках где -то в памяти, которые содержат данные и ссылки на другие блоки. Когда объект создается с использованием оператора new Parent() , будет создан такого блока слева от рисунка ниже. Этот блок сохраняет атрибут name . Если вы хотите получить доступ к методу say() , мы можем получить доступ к __proto__ Parent.prototype справа, указав на атрибут prototype Parent() .
Итак, что происходит при создании нового объекта с var kid = new Child() ? Как показано на рисунке ниже:
Объект, созданный с использованием оператора new Child() , почти пуст, за исключением неявной ссылки __proto__ . В этом случае __proto__ указывает на объект, созданный с использованием оператора new Parent() в функции inherit()
При выполнении kid.say() , поскольку объект блока в левом нижнем углу не имеет метода say() , он будет запросить объект среднего блока через цепь прототипа. Тем не менее, объект среднего блока также не имеет метода say() , поэтому он следует за цепочкой прототипа, чтобы запросить самый правый объект блока, и объект, который, как оказался, имеет метод say() . Это закончено?
Выполнение здесь не закончено. this.name упоминается в методе say() , который указывает на объект, созданный конструктором. Здесь он указывает на Block new Child() . Тем не менее, в new Child() нет атрибута name (). По этой причине промежуточный блок будет запрошен, а промежуточный блок имеет атрибут name . На этом этапе запрос цепочки прототипа был завершен.
Для более подробного обсуждения, пожалуйста, ознакомьтесь с моей статьей: JavaScript Learning Notes (v) Подробное объяснение прототипов и прототипов цепей
Общий прототип
Правило этой модели заключается в том, что повторно используемые члены должны быть переданы на прототип, а не помещены в это. Следовательно, с целью наследства все, что стоит наследование, должно быть реализовано в прототипе. Следовательно, вы можете установить прототип детского объекта и прототип родительского объекта на то же самое, что и пример ниже:
function inherit(C,P){C.Prototype = P.Prototype;
}
Дочерний объект и родительский объект имеют один и тот же прототип и могут получить доступ к методу say() одинаково. Тем не менее, дочерний объект не наследует атрибут name
Прототип наследование
Прототип наследование - это «современная» бесклассовая модель наследования. См. Следующий пример:
<script type="text/javascript">// объект, который должен быть унаследован
var parent = {
Имя: "Джек" // Здесь нет полуколона
};
//新对象var Child = Object (Parent);
alert(child.name);//Jack</script>
В режиме прототипа нет необходимости использовать объектные литералы для создания родительских объектов. Как показано в следующем коде, вы можете использовать конструктор для создания родительского объекта. При этом как его собственные свойства, так и свойства прототипа конструктора будут унаследованы.
<script type="text/javascript">// родительский конструктор
функция Person () {
this.name = "trigkit4";
}
// Добавить в атрибут прототипа
Person.prototype.getName = function () {
вернуть это. name;
};
// Создать объект нового человека класса
var obj = new Person ();
//наследовать
var Kid = Object (obj);
Alert (kid.getName ()); // trigkit4
</script>
В этом режиме вы можете унаследовать только объект прототипа, который существует в существующем конструкторе. Объекты наследуют от объектов, независимо от того, как создается родительский объект, как показано в следующем примере:
<script type="text/javascript">// родительский конструктор
функция Person () {
this.name = "trigkit4";
}
// Добавить в атрибут прототипа
Person.prototype.getName = function () {
вернуть это. name;
};
// Создать объект нового человека класса
var obj = new Person ();
//наследовать
var kid = object (person.prototype);
console.log (typeof Kid.getName); // Функция, потому что это в прототипе
console.log (typeof kid.name); // не определено, потому что только этот прототип наследуется
</script>