Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES7 decorator规范是否要求描述符具有“initializer”方法_Javascript_Decorator_Ecmascript Harmony_Ecmascript 2016 - Fatal编程技术网

Javascript ES7 decorator规范是否要求描述符具有“initializer”方法

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,也没有装饰器规范。有一

使用Babel传输以下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;
}