装饰器这个概念,很早就开始听人说过,但是并没有去深入了解过。因为之前在使用mobx,里面有大量的@使用,所以 这次来学习一下。
装饰器模式- 是一种设计模式,主要是对类或者类的属性方法 在功能上进行扩展 不改变其原有的结构。
在js中decorator 就是对象进行包装,返回一个新的对象描述(descriptor)。本质其实就是一个函数,分别接收三个参数,第一个是target,即要进行装饰的类的原型,第二个参数是key,即要进行装饰的类或者方法属性的名称,第三个是descriptor,即被装饰的类或者方法属性的descriptor。当然,它也可以接收其他参数,只是使用起来,方式略有不同,但本质还是一样的。
Object.defineProperty(obj,prop,descriptor )
js中的decorator其实是一个语法糖,作用于对象的属性时,实质利用了Object.defineProperty方法。Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
descriptor-属性描述符。对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由 getter-setter 函数对描述的属性。
get -- 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。
set-- 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。