javascript - JavaScript 中装饰器的简单解释是什么以及它在函数式编程中有何用处

标签 javascript ecmascript-6 decorator

与 HOC 相比,JavaScript 中的装饰器是什么。

我对 HOC 有一个很好的心智模型,因此想用它作为我理解装饰器的引用框架。

提前致谢

最佳答案

我将尝试举一个简单的例子。假设你想制作一个 Animal该动物可以具有 eat 的功能, sleepmake noise 。现在,您创建一个 Dog通过扩展动物(经典继承模式)。 Dog将覆盖 make noise函数为 bark , eatcarnivores等等。一头牛会覆盖 make noise函数为 Moo , eatherbivores 。这一切都很好,但接下来就是 Mountain Dog甚至没有make noise 。我们要做的就是选择 make noise函数并将其放入 CowDog ,我们在 make noise 的类中有不同的函数。这是一个简单的示例,其中经典继承使代码容易出现不可扩展性,因为需求一直在变化,而函数式编程可以通过 decorator 来解决这个问题。图案。对于上面的例子,我不会关心 type的动物。我将为每个功能设置不同的功能。

function eat(type) {
    //I'm carnivores, herbivores
    console.log(`I'm ${type}`);
}

function makeNoise(noise){
    //bark, Moo
    console.log(`I ${noise}`);
}

function sleep(sleepingWay){
    console.log(`I ${sleepingWay}`);
}

Now, we can define animals as by decorating empty `Animal` as: 

cow = compose(eat('herbivores'), makeNoise('Moo'))(Animal)
dog = compose(eat('carnivores'), makeNoise('Bhu'), sleep('at day'))(Animal)
mountainDog = compose(eat('carnivores'), sleep('at day'))(Animal) //I don't make noise

我没有编写实际的代码。我只是给出一个关于为什么我们应该使用它的想法。

使用函数式编程的另一个好处是,测试变得非常容易,因为您必须测试各个函数,并且在 React 中进行编码时,它可以节省大量时间和精力。我用recompose一直,甚至不使用 class关键词。

你必须注意所有的函数都是 pure状态是immutable 。希望这可以帮助。如果您需要进一步了解,请告诉我

关于javascript - JavaScript 中装饰器的简单解释是什么以及它在函数式编程中有何用处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50168239/

相关文章:

php - Zend Framework 表单、装饰器和验证 : should I go back to plain HTML?

python - 使用 **kwargs 和装饰器来防止重复代码是否可以接受?

javascript - HTML、CSS : how can I merge these divs in order to use float:left property on their children?

javascript - 无法识别pdf文件multer Node js

javascript - 这是什么类型的语法以及它的含义是什么? 'variable?: value'

javascript - Reactjs onclick 不工作

javascript - 更改 url 中的 #id 并按 enter 不会导致导航到指定的 id

javascript - foreach 循环数组 promise 不被返回

javascript - 尽管已设置,但 this.state.value 未定义

以@开头的python行