Недавно я прочитал в Интернете о чьем-то опыте во время интервью с Taobao, а затем обнаружил, что есть много вещей, которые мне не ясны, поэтому я написал несколько статей, чтобы углубить свое понимание некоторых вопросов.
В статье упоминается вопрос: как JavaScript реализует наследование?
Ниже я объясню некоторые методы и примеры, которые я нашел в Интернете, чтобы углубить свое впечатление.
Мы знаем, что функция в JavaScript универсальна. Помимо определения функций, ее также можно использовать для определений классов.
Наследование в JavaScript немного странно. В отличие от C++ и некоторых объектно-ориентированных языков, в нем нет модификаций управления доступом, таких как общедоступный и частный, а также нет реализации или других специальных символов, указывающих на наследование.
Что касается наследования классов JavaScript, вы можете обратиться к следующему примеру.
Скопируйте код кода следующим образом:
<тип сценария="текст/javascript">
функция Человек() {
//характеристики
this.Gender = "женский";
this.Age = 18;
this.Words = "Тишина";
// метод
this.shouting = функция() {
alert("Счастлив! Метод родительского класса");
}
}
//Наследовать
functionProgrammer() {
this.base = Человек;
}
Programmer.prototype = новый человек;
//Добавляем новые методы в подклассы
Programmer.prototype.typeCode = function() {
alert("Я программист! IT-мигрант, очень недоволен. Метод подкласса");
}
// Пример вызова
функция SayHello() {
вар а = новый программист ();
alert(a.Gender); // Вызов свойств родительского класса
a.shouting(); // Вызов метода родительского класса
a.typeCode(); // Вызов метода подкласса
}
сказатьПривет();
</скрипт>
В приведенном выше примере сначала объявляется класс человека, который содержит некоторые атрибуты и методы, а затем объявляется класс программиста, имеющий базовый атрибут. Этот атрибут не обязателен, но для целей спецификации и для поиска объектов. будущее Все унаследованные классы должны быть написаны, а затем класс человека копируется в объект-прототип (прототип), таким образом реализуется наследование классов;
Имитация некоторых принципов работы классов и наследования в JavaScript.
В объектно-ориентированных языках мы используем классы для создания собственного объекта. Однако все в JavaScript является объектом, так как же создать собственный объект?
Для этого необходимо ввести еще одно понятие — прототип. Мы можем просто рассматривать прототип как шаблон. Все вновь созданные пользовательские объекты являются копиями этого шаблона (прототипа) (на самом деле это не копия, а ссылка. Просто такого рода ссылка является). невидим и создает у людей впечатление, что это копия).
Давайте рассмотрим пример создания пользовательского объекта через прототип:
Скопируйте код кода следующим образом:
//Конструктор
функция Person(имя, пол) {
это.имя = имя;
this.sex = секс;
}
//Определение прототипа Person. На свойства прототипа могут ссылаться пользовательские объекты.
Человек.прототип = {
getName: функция() {
вернуть это.имя;
},
getSex: функция() {
вернуть this.sex;
}
}
Здесь мы называем функцию Person конструктором, который представляет собой функцию, создающую пользовательский объект. Видно, что JavaScript моделирует функции классов через конструкторы и прототипы.
Ниже приведен пример, подробно объясняющий конкретную работу, выполняемую JavaScript при создании пользовательского объекта:
Скопируйте код кода следующим образом:
var zhang = new Person("ZhangSan", "man");
console.log(zhang.getName()); // "ЧжанСань"
var chun = new Person("ЧунХуа", "женщина");
console.log(chun.getName()); // "ЧунХуа"
Когда выполняется код var zhang = new Person("ZhangSan", "man"), внутри фактически выполняются следующие вещи:
Создайте пустой объект (новый объект()).
Скопируйте атрибуты (пары ключ-значение) из Person.prototype в этот пустой объект (как мы упоминали ранее, внутренняя реализация — это не копия, а скрытая ссылка).
Передайте этот объект конструктору через ключевое слово this и выполните конструктор.
Присвойте этот объект переменной zhang.
Вся работа сделана.
Чтобы доказать, что шаблон прототипа не копируется в экземпляр объекта, а является способом связывания, посмотрите следующий код:
Скопируйте код кода следующим образом:
функция Person(имя, пол) {
это.имя = имя;
this.sex = секс;
}
Person.prototype.age = 20;
var zhang = new Person("ZhangSan", "man");
console.log(zhang.age // 20);
// Переопределить атрибут возраста в прототипе
чжан.возраст = 19;
console.log(zhang.age // 19);
удалить zhang.age;
// После удаления атрибута age экземпляра значение этого атрибута снова получается из прототипа
console.log(zhang.age // 20);
В приведенном выше примере, если он получен только путем копирования, после удаления атрибута age объект не будет существовать. Однако атрибут age в примере все равно может быть выведен, иначе предыдущее значение будет перезаписано, что указывает на то, что мы. удалил только одноименный атрибут в подклассе, а атрибут age в родительском классе все еще существует в объекте по невидимой ссылке.
Как реализовать простое наследование в JavaScript?
В следующем примере создается класс сотрудника «Сотрудник», который наследует все свойства прототипа-прототипа от Person.
Скопируйте код кода следующим образом:
function Сотрудник(имя, пол,ID сотрудника) {
это.имя = имя;
this.sex = секс;
this.employeeID = идентификатор сотрудника;
}
// Укажите прототип Сотрудника на экземпляр Человека
// Поскольку экземпляры Person могут вызывать методы прототипа Person, экземпляры Сотрудники также могут вызывать все свойства прототипа Person.
Сотрудник.прототип = новый человек();
Сотрудник.prototype.getEmployeeID = функция() {
вернуть this.employeeID;
};
var zhang = новый сотрудник("ZhangSan", "man", "1234");
console.log(zhang.getName()); // "ЧжанСан"
Хорошо, выше приведены некоторые конкретные процессы и методы реализации наследования в JavaScript.
Конечно, подводя итог, можно сказать, что механизм наследования в JavaScript основан только на симуляции. По сравнению с некоторыми объектно-ориентированными языками он груб и имеет некоторые недостатки. Однако в целом это все равно не снижает эффективность фронтенд-разработчиков. . энтузиазм.