ES6 getter /方法没有花括号

时间:2017-03-01 19:25:49

标签: javascript typescript methods ecmascript-6 getter

我有一些由很多短的getter /方法组成的类。

示例:

com.google.api.client.http.HttpResponseException: 403

    Forbidden
    {
     "error": {
      "errors": [
       {
        "domain": "global",
        "reason": "insufficientPermissions",
        "message": "Insufficient Permission"
       }
      ],
      "code": 403,
      "message": "Insufficient Permission"
     }
    }

            at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1070)
            at com.google.api.client.googleapis.media.MediaHttpDownloader.executeCurrentRequest(MediaHttpDownloader.java:245)
            at com.google.api.client.googleapis.media.MediaHttpDownloader.download(MediaHttpDownloader.java:199)
            at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeMediaAndDownloadTo(AbstractGoogleClientRequest.java:562)
            at com.google.api.services.drive.Drive$Files$Export.executeMediaAndDownloadTo(Drive.java:3402)
            at Quickstart.downloadFile(Quickstart.java:162)
            at Quickstart.main(Quickstart.java:130)

具有类似内容的箭头功能可写如下:

get jQuery() {
  return this.pageConfig.jQuery || jQuery;
}

这是一个单行,因此仅消耗垂直空间的1/3。

但它不是吸气剂,也不是方法。

是否有推荐的方式以单线形式编写吸气剂/方法? (如果可能,没有大括号,没有() => this.pageConfig.jQuery || jQuery; 关键字)

我的getter和方法不需要修改对象。他们只是在阅读。

4 个答案:

答案 0 :(得分:4)

对于一个班轮,请按照这个:

get jQuery() {return this.pageConfig.jQuery || jQuery;}

箭头函数不适用于方法定义,因为它们使用词法this,而方法需要对象this。请记住,虽然箭头函数是一个很好的简写,但它们也会以一种通常与方法定义不兼容的方式影响this的值。

答案 1 :(得分:3)

不,没有什么比(你可以跳过;

更短
get jQuery() { return this.pageConfig.jQuery || jQuery }

更多解释

你不能使用箭头函数(() => this.pageConfig.jQuery || jQuery),因为对于一个它不是一个getter函数而this没有引用对象的上下文而是执行的上下文(这可能是对象但不必。

__defineGetter__函数(some documentation)允许您定义一个getter。它已被弃用,可能比get更复杂。但正如文档所说,它被广泛使用,可能永远不会被删除。

幸运的是:我全都是疯狂的解决方案

class Test {
  
  constructor() {
    this.pageConfig = {}
    this.pageConfig.jQuery = "value"
    
    let properties = {
      'jQuery': () => this.pageConfig.jQuery || "Default",
      'text': () => this.pageConfig.text || "Default"
    }
    for(let prop in properties) this.__defineGetter__(prop, properties[prop])
    
  }
  
}

let t = new Test
console.log(t.jQuery)
console.log(t.text)

快乐的一面(但老实说,只需使用ECMA 5中的get

答案 2 :(得分:0)

漂亮的单线解决方案:

readonly jQuery = this.pageConfig.jQuery || jQuery

它很短,表现得像你期望的那样,并且不需要花括号。

答案 3 :(得分:0)

我当时正在考虑建立一个babel库来处理这个问题 我认为类似这样的东西

const weekDays = [
            {
                day: 'Sunday',
                get input() {
                    return TimeRange(this.day)
                }
                // something like this
                // get input() => TimeRange(this.day)
            }
]