带箭头功能的ES6采集器/定位器

2022-08-30 02:42:33

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

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

但对于属性,箭头函数不起作用。这有效:

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

但我不能使用箭头函数:

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

这是故意的吗?


答案 1

根据 ES2015 语法,对象文本上的属性只能是以下三种情况之一:

属性定义

  • 标识符引用
  • 属性名称赋值表达式:
  • 方法定义

这些类型中唯一允许前导的类型是 MethodDefinitionget

方法定义

  • 属性名称 StrictFormalParameters FunctionBody(){ }
  • 发电机方法
  • 获取属性名称函数体(){ }
  • set PropertyNamePropertySetParameterList FunctionBody){ }

如您所见,表单遵循非常有限的语法,该语法必须是get

get NAME () { BODY }

语法不允许以下形式的函数。get NAME = ...


答案 2

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

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

例如,我注意到OP使用,你可能想在词法上绑定这个;又名“这个的非绑定”),箭头函数对词法绑定是好的。this

您仍然可以通过该技术将箭头函数与 getter 一起使用。Object.defineProperty

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

请参阅对象初始化技术(又名 get NAME() {...}defineProperty 技术 (aka get : ()=>{})的提及。至少有一个显著的区别,使用要求变量已经存在:defineProperty

现有对象上定义 getter

也就是说,您必须确保(在我的示例中)存在并保存到变量中(而使用a,您可以在对象初始化中返回对象文本:)。有关 Object.defineProperty 的更多信息,请点击此处Object.definePropertyyour_objobject-initialization{..., get(){ }, ... }

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