Ecmascript 6 ES6带箭头功能的getter/setter

Ecmascript 6 ES6带箭头功能的getter/setter,ecmascript-6,babeljs,Ecmascript 6,Babeljs,我正在使用babel6,对于我的宠物项目,我正在为XMLHttpRequest创建一个包装器,用于我可以使用的方法: open = (method, url, something) => { return this.xhr.open(method, url, something); } 但是对于属性,arrow函数不起作用 这项工作: get status() { return this.xhr.status; } 但是我不能用 get status = () => this

我正在使用babel6,对于我的宠物项目,我正在为XMLHttpRequest创建一个包装器,用于我可以使用的方法:

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}
但是对于属性,arrow函数不起作用

这项工作:

get status() { return this.xhr.status; }
但是我不能用

get status = () => this.xhr.status;

这是故意的吗?

根据ES2015语法,这只能是四件事之一:

属性定义:

  • 识别参考
  • PropertyName
    AssignmentExpression
  • 方法定义
这些类型中唯一允许前导
get
的是:

方法定义:

  • PropertyName
    StrictFormalParameters
    {
    FunctionBody
    }
  • 发电机法
  • 获取
    属性名称
    {
    函数体
    }
  • 设置
    属性名称(PropertySetParameterList
    {
    函数体
    }
如您所见,
get
表单遵循的语法非常有限,必须是该表单的语法

get NAME () { BODY }

语法不允许使用形式为
get NAME=…

的函数。公认的答案很好。如果您愿意使用普通函数语法而不是紧凑的“箭头函数语法”,这是最好的

但也许你真的喜欢箭头函数;也许您使用arrow函数的另一个原因是普通函数语法无法替代的;您可能需要不同的解决方案

例如,我注意到OP使用了
this
,您可能想这样做),而arrow函数对于词汇绑定非常有用

您仍然可以通过
Object.defineProperty
技术使用带有getter的箭头函数

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}
参见提及的vs。至少存在一个显著差异,使用
defineProperty
要求变量已经存在:

在现有对象上定义getter

i、 e.对于
Object.defineProperty
,您必须确保
您的_obj
(在我的示例中)存在并保存到变量中(而对于
对象初始化
,您可以在对象初始化中返回对象文本:
{…,get(){},}
)。更多关于


Object.defineProperty(…)
似乎具有与
get NAME(){…}
语法相当的浏览器支持;现代浏览器,即9。

谢谢你的帮助,我接受你的回答。您知道在哪里定义了getter/setter不能与赋值一起使用吗?只是好奇。@GaborDolla被编辑以引用ECMAScript规范中的对象文字语法。您不需要花括号或返回;您可以说
(method,url,something)=>this.xhr.open(method.url,something)
get
是对象文本或类定义的一部分,变量赋值不是。为什么你认为它们应该是一样的呢?
status=>this.xhr.status
(c#7 syntax)或者可能
get status()=>this.xhr.status
确实是可读性方面的一大语法糖,但Javascript而不是Typescript(现在?)不支持它,但它最终比:
get status()更详细{return this.xhr.status;}
@devuxer我同意它太冗长了。但要明确一点,您的
this
必须是您的
get status(){…}所在的对象
已定义。但由于词法绑定的差异,我的
可能是其他内容,对吗?同意……尽管在实践中,我没有遇到过这样的情况,即
不是我想要的get访问器。(箭头函数的
这个
绑定好处似乎在传递函数时发挥作用,就像事件处理程序和回调一样。)我同意,我经常使用胖箭头+词汇绑定
()=>{}
作为传递给承诺的回调,比如
$http(…)。然后((承诺结果)=>这个…)
。如果我不使用胖箭头,
将表示全局
窗口
对象;不是很有用。但是我很少(从来没有?)使用
()=>{}
作为您所说的“获取访问器”的函数。。。至少
这个
get()
内部将表示定义了
get()
的对象(它已经比
窗口
更有用;因此不需要使用胖箭头函数!),
定义属性
方法在循环中很有用。现在我只是用它从包含chiled的对象中暴露chiled对象的一些属性。