Там принцип в программировании называется не повторять себя (сухой). Повторный код причина является проблемой, потому что любые изменения требуют фиксации кода в нескольких местах. Это обычно означает больше работы для программистов и больше места для ошибок.
Уведомление в примере ниже, что
Ешьте
Метод совместно используетсяКот
иМедведь
:
function Cat(name) { this.name = name; } Cat.prototype = { constructor: Cat, eat: function() { console.log("nom nom nom"); } }; function Bear(name) { this.name = name; } Bear.prototype = { constructor: Bear, eat: function() { console.log("nom nom nom"); } };
-
Ешьте
Метод повторяется в двух местах. Код может быть отредактирован, чтобы следовать сухому принципу, создаваяSupertype
(или родитель) под названиемЖивотное
:
function Animal() { } Animal.prototype = { constructor: Animal, eat: function() { console.log("nom nom nom"); } };
- С
Животное
включает в себя. Ешьте
Метод, вы можете удалить его изКот
иМедведь
:
function Cat(name) { this.name = name; } Cat.prototype = { constructor: Cat }; function Bear(name) { this.name = name; } Bear.prototype = { constructor: Bear }; function Animal() { } Animal.prototype = { constructor: Animal, eat: function() { console.log("nom nom nom"); } };
- Мы только что отредактировали код в духе сухого, двигая
Ешьте
МетодЖивотное
Supertype
Отказ
Наследует поведение от Supertype
- В предыдущем посте мы создали
Supertype
называетсяЖивотное
Это определило поведение, разделяемое всеми животными:
function Animal() { } Animal.prototype.eat = function() { console.log("nom nom nom"); };
- Это и следующая часть будет охватывать, как повторно использовать
Животное
Методы внутриСобака
не определяя их снова. Он использует технику, называемую наследство. Эта проблема охватывает первый шаг: сделать экземплярSupertype
(или родитель).
let animal = Object.create(Animal.prototype);
- Вы также можете использовать это,
let animal = new Animal();
Но есть некоторые недостатки при использовании этого синтаксиса для наследования, которые слишком сложны для объема этого примера.
Object.Create (OBJ)
Создает новый объект и устанавливаетobj
Как новый объектПрототип
Отказ Напомним, чтоПрототип
как «рецепт» для создания объекта. УстановивПрототип
животное
бытьЖивотное
прототип
, вы эффективно даетеживотное
Пример такой же «рецепт» как любой другой экземплярЖивотное
Отказ
function Animal() { } Animal.prototype = { constructor: Animal, eat: function() { console.log("nom nom nom"); } }; let beagle = Object.create(Animal.prototype) beagle.eat(); // will display nom nom nom console.log(beagle instanceof Animal); // will display true
Установка прототипа ребенка в экземпляр родителя
В предыдущем разделе вы видели первый шаг для наследственного поведения от
Supertype
(или родитель)Животное
: Создание нового экземпляраЖивотное
ОтказЭтот пост охватывает следующий шаг: установить
Прототип
изподтип
( или ребенок) — в этом случаеСобака
— быть экземпляромЖивотное
Отказ
Dog.prototype = Object.create(Animal.prototype);
- Помните, что
Прототип
как «рецепт» для создания объекта. В некотором смысле, рецептСобака
Теперь включает в себя все ключевые «ингредиенты» отЖивотное
Отказ
function Animal() { } Animal.prototype = { constructor: Animal, eat: function() { console.log("nom nom nom"); } }; function Dog() { } Dog.prototype = Object.create(Animal.prototype); // <---- let beagle = new Dog(); beagle.eat(); // will display when console.log nom nom nom
Бигль
наследует всеЖивотное
Свойства, в том числеЕшьте
метод.
Сброс недвижимости унаследованного конструктора
Когда объект наследует его
Прототип
От другого объекта, он также наследует свойство конструктора Supertype.Вот пример:
function Dog() { } Dog.prototype = Object.create(Animal.prototype); let beagle = new Dog(); beagle.constructor
- Но
Бигль
и все экземплярыСобака
следует показать, что они были построеныСобака
И неЖивотное
. Для этого вы можете вручную установитьСобака
Конструктор недвижимости к объекту собаки:
function Animal() { } function Dog() { } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; let beagle = new Dog(); console.log(beagle.constructor); // will display [Function: Dog]
Добавить методы после наследования
- Функция конструктора, которая наследует ее
Прототип
объект изSupertype
Функция конструктора все еще может иметь свои собственные методы в дополнение к унаследованным методам. - Например,
Собака
это конструктор, который наследует егоПрототип
от животного:
function Animal() { } Animal.prototype.eat = function() { console.log("nom nom nom"); }; function Dog() { } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog;
- В дополнение к тому, что унаследовано от
Животное
, вы хотите добавить поведение, которое уникально дляСобака
объекты. ЗдесьСобака
Получукора ()
функция. Функции добавляются вСобака
Прототип
так же, как и любой функция конструктора:
Dog.prototype.bark = function() { console.log("Woof!") };
- Сейчас экземпляры
Собака
будет иметь обаесть ()
икора ()
методы.
function Animal() { } Animal.prototype.eat = function() { console.log("nom nom nom"); }; function Dog() { } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; Dog.prototype.bark = function() { // <---- console.log("Woof!") } let beagle = new Dog(); beagle.eat(); beagle.bark()
Beagle.eat ()
будет отображать строкуNOM NOM NOM
в консоли иBeagle.bark ()
будет отображать строкуУдар!
.
Оригинал: «https://dev.to/rthefounding/using-inheritance-so-you-don-t-repeat-yourself-ba8»