带箭头功能的ES6 getter / setter

时间:2015-11-20 13:08:38

标签: ecmascript-6 babeljs

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

pagingEnabled

但是对于属性箭头功能不起作用

这有效:

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}

但我无法使用

get status() { return this.xhr.status; }

这是故意的吗?

3 个答案:

答案 0 :(得分:73)

根据ES2015语法,a property on an object literal只能是四件事之一:

  

PropertyDefinition

     
      
  • IdentifierReference
  •   
  • PropertyName : AssignmentExpression
  •   
  • MethodDefinition
  •   

允许排名get的这些类型中唯一一个是MethodDefinition

  

MethodDefinition

     
      
  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  •   
  • GeneratorMethod
  •   
  • get PropertyName ( ) { FunctionBody {{1} }
  •   
  • } PropertyName PropertySetParameterList set ) FunctionBody {
  •   

正如您所看到的,}形式遵循非常有限的语法,必须采用

形式
get

语法不允许使用get NAME () { BODY } 形式的函数。

答案 1 :(得分:23)

接受的答案很棒。如果您愿意使用普通函数语法而不是 compact"箭头函数语法"

但也许你真的喜欢箭头功能;也许您使用箭头功能是出于另一个原因,正常的函数语法无法取代您可能需要一个不同的解决方案。

例如,我注意到OP使用this,你可能想要bind this lexically; aka "non-binding of this"),而箭头函数对于那个词法绑定是有用的。

您仍然可以通过Object.defineProperty技术将箭头功能与吸气剂一起使用。

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}

请参阅object initialization technique (aka get NAME() {...})defineProperty technique (aka get : ()=>{})的提及。至少存在一个显着差异,使用defineProperty要求变量已经存在:

  

现有对象上定义一个getter

即。使用Object.defineProperty,您必须确保your_obj(在我的示例中)存在并保存到变量中(而使用object-initialization,您可以在对象初始化中返回对象 - 文字:{{ 1}})。有关Object.defineProperty specifically, here

的更多信息

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

答案 2 :(得分:-3)

        _getvalue: () => {
            return this.array.length;
        }
        get value(): number {
            return this._getvalue();;
        }

访问类中的父对象

对我有用:P