ES6装饰器
我们在使用ES6开发是,如使用umijs+dva开发,经常会使用
@connect()
,然后,我们的组件中的属性,就会用dispacth
方法,同时,也会注入响应的model
。如何实现的呢?
其实就是ES6的装饰器。在设计模式中,有一种模式叫,装饰器模式
,那么,ES6中在语法@
其实就是一种装饰器模式的实现(@
的本质其实是语法糖),同事,也可以理解AOP(面向切面的编程)的实现
@装饰器的本质
ES6中装饰器的本质其实是一个函数,如下:
@myDecorator
class A {
}
// 等同于
class A {
}
A = myDecorator(A) || A;
也就是定义了一个myDecorator
的函数,该函数的第一个参数为紧跟在下面的类A
然后将改函数的返回的值重新赋值给A,如果函数没有返回值,则,默认返回A
本身
那么装饰啥呢?
对类的装饰
通常对类的装饰通常,是添加方法,或修改方法
如何实现对被装饰类的方法进行修改或添加方法呢?
主要是通过对象的原型链属性 prototype
实现,如我们需要对A添加一个打印的方法
function myDecorator(target) {
target.show = function () {
console.log('static function show...')
}
target.prototype.print = function() {
<