ES6 getter/method 没有花括号

ES6 getter/method without curly braces

我有一些 类,其中包含许多短 getters/methods。

示例:

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

类似内容的箭头函数可以这样写:

() => this.pageConfig.jQuery || jQuery;

这是单行的,因此只占用垂直方向的 1/3 space。

但它不是 getter 也不是方法。

getters/methods有没有推荐的单行写法? (如果可能,没有花括号和 return 关键字)

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

对于一个班轮,只需这样做:

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

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

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

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

多一点解释

您不能使用箭头函数 (() => this.pageConfig.jQuery || jQuery),因为它不是 getter 函数,而且 this 不引用对象的上下文但是执行的上下文(可以是对象但不一定是。

is/was __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

不错的单行解决方案:

readonly jQuery = this.pageConfig.jQuery || jQuery

它很短,表现得像您对 getter 的期望,并且不需要大括号。

我正在考虑构建一个 babel 库来处理这个问题 我认为这样的东西看起来很花哨

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