ES6 getter/setter with arrow function

后端 未结 2 680
滥情空心
滥情空心 2020-12-28 11:20

I\'m using babel6 and for my pet project I\'m creating a wrapper for XMLHttpRequest, for the methods I can use:

open = (method, url, something) => {
  ret         


        
相关标签:
2条回答
  • 2020-12-28 11:50

    The accepted answer is great. It's the best if you're willing to use normal function syntax instead of compact "arrow function syntax".

    But maybe you really like arrow functions; maybe you use the arrow function for another reason which a normal function syntax cannot replace; you may need a different solution.

    For example, I notice OP uses this, you may want to bind this lexically; aka "non-binding of this"), and arrow functions are good for that lexical binding.

    You can still use an arrow function with a getter via the Object.defineProperty technique.

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

    See mentions of object initialization technique (aka get NAME() {...}) vs the defineProperty technique (aka get : ()=>{}). There is at least one significant difference, using defineProperty requires the variables already exists:

    Defining a getter on existing objects

    i.e. with Object.defineProperty you must ensure that your_obj (in my example) exists and is saved into a variable (whereas with a object-initialization you could return an object-literal in your object initialization: {..., get(){ }, ... }). More info on Object.defineProperty specifically, here

    Object.defineProperty(...) seems to have comparable browser support to the get NAME(){...} syntax; modern browsers, IE 9.

    0 讨论(0)
  • 2020-12-28 11:55

    According to the ES2015 grammar, a property on an object literal can only be one of four things:

    PropertyDefinition:

    • IdentifierReference
    • PropertyName : AssignmentExpression
    • MethodDefinition

    The only one of these type that allows a leading get is MethodDefinition:

    MethodDefinition :

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

    As you can see, the get form follows a very limited grammar that must be of the form

    get NAME () { BODY }
    

    The grammar does not allow functions of the form get NAME = ....

    0 讨论(0)
提交回复
热议问题