JavaScript中装饰器的简单解释是什么?它在函数式编程中有多有用

JavaScript中装饰器的简单解释是什么?它在函数式编程中有多有用,javascript,ecmascript-6,decorator,Javascript,Ecmascript 6,Decorator,与HOC相比,javascript中的装饰器是什么 我有一个很好的HOC心理模型,因此我想用它作为我了解装饰师的参考框架 提前感谢我将尝试给出一个简单的例子。假设您想制作一只动物,该动物可以具有吃、睡和制造噪音的功能。现在,您可以通过扩展animal(经典继承模式)创建一个狗狗会将制造噪音功能覆盖到吠叫,吃到食肉动物等。奶牛会将制造噪音功能覆盖到鸣叫,吃到食草动物。这一切都是好的,但随后出现了一个点,山狗甚至不发出噪音。我们要做的是选择制造噪音函数并将其放入奶牛中,对于狗,我们在类中为制造噪音提

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

我有一个很好的HOC心理模型,因此我想用它作为我了解装饰师的参考框架


提前感谢

我将尝试给出一个简单的例子。假设您想制作一只
动物
,该动物可以具有
制造噪音
的功能。现在,您可以通过扩展animal(经典继承模式)创建一个
<代码>狗
会将
制造噪音
功能覆盖到
吠叫
食肉动物
等。奶牛会将
制造噪音
功能覆盖到
鸣叫
食草动物
。这一切都是好的,但随后出现了一个点,
山狗
甚至不发出噪音。我们要做的是选择
制造噪音
函数并将其放入
奶牛
中,对于
,我们在类中为
制造噪音
提供了不同的函数。这是一个简单的例子,其中经典继承使代码易于不可伸缩,因为需求一直在变化,这时函数式编程就开始使用
decorator
模式进行拯救。对于上面的例子,我不关心动物的
类型。我将为每个功能提供不同的功能

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中编码时,它可以节省大量的时间和精力。我一直在使用,甚至不用
class
关键字


您必须注意所有函数都是
纯的
,并且状态是
不可变的
。希望这有帮助。如果您需要进一步了解,请告诉我,装饰器不是标准的一部分,它们的语法和功能仍在作为一个整体进行讨论。相同的想法,不同的范例…装饰器是特定于类的,如果您指的是。只要你不混合OOP和FP,它们就没有用处。这是非常有用的,所以重新组合是装饰器模式。谢谢@ajay gaur