The accepted answer is great. It's the best if you're willing to use normal function syntax/ object initialization/MethodDefinition
syntax like get NAME () { BODY }
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, specifically with the accessor descriptor approach:
{
...
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
An advantage of the Object.defineProperty(...)
approach is that you can run the code in a loop (i.e. define multiple properties)
Another difference between the two approaches is when you use get
on an class vs defineProperty
on an instance of a class:
When using get
the property will be defined on the instance's prototype, while using Object.defineProperty()
the property will be defined on the instance it is applied
Object.defineProperty(...)
seems to have comparable browser support to the get NAME(){...}
syntax; modern browsers, IE 9.
Notice the other options available to you when using Object.defineProperty(...)
:
enumerable
: set to true if you want to enumerate/iterate over your new property using Object.keys
configurable
: set to true if you want to redefine or delete your property