Starting with ECMAScript 2015, a shorter syntax for method definitions on objects initializers is introduced. It is a shorthand for a function assigned to the method's name.
var obj = {
property( parameters… ) {},
*generator( parameters… ) {},
async property( parameters… ) {},
// with computed keys:
[property]( parameters… ) {},
*[generator]( parameters… ) {},
async [property]( parameters… ) {},
// compare getter/setter syntax:
get property() {},
set property(value) {}
};
The shorthand syntax is similar to the getter and setter syntax introduced in ECMAScript 2015.
Given the following code:
var obj = {
foo: function() {
/* code */
},
bar: function() {
/* code */
}
};
You are now able to shorten this to:
var obj = {
foo() {
/* code */
},
bar() {
/* code */
}
};
Note : The shorthand syntax uses named function instead of anonymous functions (as in …foo: function() {}…). Named functions can be called from the function body (this is impossible for anonymous function as there is no identifier to refer to). For more details, see function.
Generator methods can be defined using the shorthand syntax as well. When using them,
* g(){} will work but g *(){} will not;non-generator method definitions may not contain the yield keyword. This means that legacy generator functions won't work either and will throw a SyntaxError. Always use yield in conjunction with the asterisk (*).
// Using a named property
var obj2 = {
g: function* () {
var index = 0;
while (true)
yield index++;
}
};
// The same object using shorthand syntax
var obj2 = {
* g() {
var index = 0;
while (true)
yield index++;
}
};
var it = obj2.g();
console.log(it.next().value); // 0
console.log(it.next().value); // 1 Async methods can also be defined using the shorthand syntax.
// Using a named property
var obj3 = {
f: async function () {
await some_promise;
}
};
// The same object using shorthand syntax
var obj3 = {
async f() {
await some_promise;
}
};
All method definitions are not constructors and will throw a TypeError if you try to instantiate them.
var obj = {
method() {}
};
new obj.method; // TypeError: obj.method is not a constructor
var obj = {
* g() {}
};
new obj.g; // TypeError: obj.g is not a constructor (changed in ES2016)
var obj = {
a: 'foo',
b() { return this.a; }
};
console.log(obj.b()); // "foo"
The shorthand syntax also supports computed property names.
var bar = {
foo0: function() { return 0; },
foo1() { return 1; },
['foo' + 2]() { return 2; }
};
console.log(bar.foo0()); // 0
console.log(bar.foo1()); // 1
console.log(bar.foo2()); // 2 | Specification | Status | Comment |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Method definitions' in that specification. | Standard | Initial definition. |
| ECMAScript 2016 (ECMA-262) The definition of 'Method definitions' in that specification. | Standard | Changed that generator methods should also not have a [[Construct]] trap and will throw when used with new. |
| ECMAScript 2017 Draft (ECMA-262) The definition of 'Method definitions' in that specification. | Draft |
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Method definition shorthand | 39 | 34 (34) | No support | 26 | No support |
| Generator methods are not constructable (ES2016) | ? | 43 (43) | ? | ? | ? |
| Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Method definition shorthand | No support | No support | 34.0 (34) | No support | No support | No support |
| Generator methods are not constructable (ES2016) | ? | ? | 43.0 (43) | ? | ? | ? |
get" and "set" were invalid names for generator methods. This has been fixed in bug 1073809.SyntaxError in this and later versions (bug 1150855). var o = {x() 12}; // SyntaxError
© 2005–2017 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions