Ecmascript 6 ES6带箭头功能的getter/setter
我正在使用babel6,对于我的宠物项目,我正在为XMLHttpRequest创建一个包装器,用于我可以使用的方法: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
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对象的一些属性。