Javascript ES7 decorator规范是否要求描述符具有“initializer”方法
使用Babel传输以下es7代码:Javascript ES7 decorator规范是否要求描述符具有“initializer”方法,javascript,decorator,ecmascript-harmony,ecmascript-2016,Javascript,Decorator,Ecmascript Harmony,Ecmascript 2016,使用Babel传输以下es7代码: let obj = { @decorate prop: 10 } let decorate = ( object, propertyName, desc ) => desc 调用decoration时,属性描述符desc包含名为initializer的方法,该方法在执行时返回obj.prop的值 初始值设定项方法是es7装饰器规范的一部分,还是这纯粹是巴贝尔转换为es5的副作用 es7装饰规范 请注意,目前还没有ES7,也没有装饰器规范。有一
let obj = {
@decorate
prop: 10
}
let decorate = ( object, propertyName, desc ) => desc
调用decoration
时,属性描述符desc
包含名为initializer
的方法,该方法在执行时返回obj.prop
的值
初始值设定项
方法是es7装饰器规范的一部分,还是这纯粹是巴贝尔转换为es5的副作用
es7装饰规范
请注意,目前还没有ES7,也没有装饰器规范。有一个草案,一个和谐的提议,关于如何扩展语言
调用decoration
时,属性描述符desc
包含一个名为initializer
这有点奇怪。从中,我希望装饰器总是使用该属性的属性描述符调用,这将是
{value: 10, writable: true, enumerable: true, configurable: true}
以你为例。但是,草案中的示例只列出了方法(和访问器属性)的修饰符,包括类和对象文本,而不是值属性
初始值设定方法是装饰人方案的一部分吗
目前还没有,但他们的存储库中有一个文件概述了decorators与来自的属性初始化器的互操作性(这是一个未完成的草案,但也已经在babel中实现)。它确实使用了静态修饰符,这些修饰符是一个带有初始值设定项的描述符
函数,该函数将在构造函数中(在构造函数之前)初始化实例属性
这纯粹是巴别塔转换为es5的副作用吗
不完全是,可能是因为BabelTrpIsIle类属性,这使得它们看起来与对象文本上的值属性相同。 < P> <代码>初始化器< /C>函数在考虑TC39建议时大部分都是有意义的。
考虑以下代码:
class C {
prop = {};
}
const a = new C()
const b = new C()
console.log(a.prop === b.prop)
您希望输出为false
因此,属性的“值”不能存储为静态值
,而必须编码为每次返回新值(此处为空对象)的函数
该代码被传输到相当于:
class C {
constructor () {
const propName = 'prop'
const propDesc = Object.getOwnPropertyDescriptor(this.constructor.prototype, propName)
this[propName] = propDesc.initializer.call(this)
}
}
这还允许您在声明其他实例变量时引用此
(仍在该提案的上下文中):
由于类C
基本上是编写C.prototype
的语法糖,类属性上的装饰器实际上与对象属性上的装饰器相同(在本例中,对象就是原型)
初始值设定项
模式允许在这两种情况下使用单一方式编写装饰程序。谢谢,正如我所期望的那样。安全地假设您不能依赖初始值设定项
作为返回值的方法我认为假设初始值设定项
总是返回值是可取的,但事实上,您确实不能依赖巴贝尔实验特性中的任何东西。
class C {
entries = [ 1, 2, 3 ];
count = this.entries.length;
}