javascript — наследование с фабричным методом / шаблоном класса

Наследование с фабричным методом / шаблоном класса

Я проверил эту проблему, потому что я решил использовать Factory Functions вместо классов. Я предполагаю, что у вас есть общая фабричная функция, такая как Animal или Mammal , которая имеет некоторые характеристики (такие как звук, как некоторые предложили), и вы хотите наследовать их и добавить некоторую специфическую характеристику в другую фабричную функцию.

Давайте создадим функцию фабрики Animal:

 const Animal = ({color = "green", numberOfLegs = 4} = {}) ={amp}gt; { const SetColor = (newColor) ={amp}gt; { color = newColor; }; const GetColor= () ={amp}gt; color; const GetNumberOfLegs = () ={amp}gt; numberOfLegs; const MakeSound = () ={amp}gt; console.log("Screetch"); return { GetColor, GetNumberOfLegs, MakeSound } } const newCreature = Animal({color: black, numberOfLegs: 3}) newCreature.MakeSound() // -{amp}gt; "Screetch" 

И давайте создадим фабричную функцию Dog:

 const Dog = ({name = "rex", color = "black", numberOfLegs = 4} = {}) ={amp}gt; { const MakeSound = () ={amp}gt; console.log("Woof Woof"); const Roll = () ={amp}gt; console.log(`${name} made a roll!`) return { MakeSound, Roll } } const sniffles = Dog({name: "sniffles", color: black, numberOfLegs: 4}) sniffles.MakeSound() // -{amp}gt; "Woof Woof" sniffles.Roll() // -{amp}gt; "sniffles made a roll!" 

Что мне делать, если я хочу унаследовать все те хорошие вещи, которые я получаю от Animal которые у меня уже есть?
Использование ES6 Spread Syntax помогает нам достичь очень аккуратного способа сделать это:

 const Dog = ({name = "rex", color = "black", numberOfLegs = 4} = {}) ={amp}gt; { const anAnimal = Animal({color, numberOfLegs}); // used the Animal factory! const MakeSound = () ={amp}gt; console.log("Woof Woof"); const Roll = () ={amp}gt; console.log(`${name} made a roll!`) return { ...anAnimal, // And That's where magic happens! MakeSound, Roll } } const sniffles = Dog({name: "sniffles", color: black, numberOfLegs: 4}) sniffles.GetNumberOfLegs() // -{amp}gt; 4 sniffles.MakeSound() // -{amp}gt; "Woof Woof" sniffles.Roll() // -{amp}gt; "sniffles made a roll!" 

Так что же на самом деле произошло?
На фабрике Dog мы вызывали фабрику Animal в anAnimal , поэтому anAnimal теперь является объектом. В объекте, который возвращает фабрика Dog , мы распространяем объект anAnimal, и после этого добавляем свойства Dog . Если вы дадите объекту два одинаковых ключа с разными значениями, он возьмет последнее:

 const someObject = {a: 1, b: 2, a: 3}; someObject // -{amp}gt; {a: 3, b: 2} 

Поэтому вам не нужно беспокоиться, если Dog использует какие-либо ключи, которые уже были предоставлены Animal , потому что они перезаписаны.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector