什么是JS代码中的`Reflect.decorate`从TS转换而来?

时间:2017-07-18 11:15:25

标签: javascript typescript

TypeScript playground上玩装饰器的时候,我注意到,在第3行的转换代码检查是否存在Reflect.decorate函数。
这个功能是什么?我无法在SOMDN documentation about Reflect上找到这个。

1 个答案:

答案 0 :(得分:8)

您的问题的答案就在于已编译代码的下一行:

else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;

要了解它,你需要记住这些事情:

  • 装饰器只是一个功能,允许您观察,修改或替换类或类成员的行为
  • 有4种类型的装饰器:类装饰器方法装饰器存取器装饰器属性装饰器
  • 每种类型的装饰器都会传递一组特定的参数:
    • 类装饰器采用类构造函数
    • 方法和访问器装饰器采用类构造函数或类原型(取决于它们是静态成员还是实例成员),名称和属性描述符
    • 属性装饰器使用方法和访问器装饰器的相同参数,除了最后一个

现在,如果再次阅读,您会看到“Reflect.decorate”是一个方法,它遍历您要应用的装饰器列表,然后根据参数的数量识别装饰器的类型,最后调用具有正确参数的装饰器(基于它检测到的类型)。

为什么他们检查Reflect.decorate是否存在?

因为在某些时候将来,他们希望Reflect.decorate成为ES标准的一部分,然后相应地在浏览器中实现。在那一刻,他们宁愿使用本地方法而不是这种polyfill。

由于此方法是“ES.later”(甚至不是ES.next)的一部分,因此没有浏览器本机尚未实现它,因此没有人将文档记录为