“I am delighted to support Nicolás’ endeavor because his book looks exactly like what people who are coming to JavaScript with fresh eyes need.”
– Brendan Eich
Ideal for professional software developers with a basic understanding of JavaScript, this practical book shows you how to build small, interconnected ES6 JavaScript modules that emphasize reusability. You’ll learn how to face a project with a modular mindset, and how to organize your applications into simple pieces that work well in isolation and can be combined to create a large, robust application.
This book focuses on two aspects of JavaScript development: modularity and ES6 features. You’ll learn how to tackle application development by following a scale-out approach. As pieces of your codebase grow too big, you can break them up into smaller modules.
The book can be read online for free or purchased through Amazon.
This book is part of the Modular JavaScript series.
Start with the book series launch announcement on Pony Foo
Participate in the crowdfunding campaign on Indiegogo
Amplify the announcement on social media via Thunderclap
Share a message on Twitter or within your social circles
Contribute to the source code repository on GitHub
Read the free HTML version of the book on Pony Foo
Purchase the book from O’Reilly on Amazon
Chapter 2
ES6 Essentials
The sixth edition of the language comes with a plethora of non-breaking syntax improvements, most of which we’ll tackle throughout this chapter. Many of these changes are syntactic sugar; that is, they could be represented in ES5, albeit using more complicated pieces of code. There are also changes that aren’t merely syntactic sugar but a completely different way of declaring variables using let
and const
, as we’ll see toward the end of the chapter.
Object literals get a few syntax changes in ES6, and they’re a good place to start.
Object Literals
An object literal is any object declaration using the {}
shorthand syntax, such as the following example:
var
book
=
{
title
:
'Modular ES6'
,
author
:
'Nicolas'
,
publisher
:
'O´Reilly'
}
ES6 brings a few improvements to object literal syntax: property value shorthands, computed property names, and method definitions. Let’s go through them and describe their use cases as well.
Property Value Shorthands
Sometimes we declare objects with one or more properties whose values are references to variables by the same name. For example, we might have a listeners
collection, and in order to assign it to a property called listeners
of an object literal, we have to repeat its name. The following snippet has a typical example where we have an object literal declaration with a couple of these repetitive properties:
var
listeners
=
[]
function
listen
()
{}
var
events
=
{
listeners
:
listeners
,
listen
:
listen
}
Whenever you find yourself in this situation, you can omit the property value and the colon by taking advantage of the new property value shorthand syntax in ES6. As shown in the following example, the new ES6 syntax makes the assignment implicit:
var
listeners
=
[]
function
listen
()
{}
var
events
=
{
listeners
,
listen
}
As we’ll further explore in the second part of the book, property value shorthands help de-duplicate the code we write without diluting its meaning. In the following snippet, I reimplemented part of localStorage
, a browser API for persistent storage, as an in-memory ponyfill.1 If it weren’t for the shorthand syntax, the storage
object would be more verbose to type out:
var
store
=
{}
var
storage
=
{
getItem
,
setItem
,
clear
}
function
getItem
(
key
)
{
return
key
in
store
?
store
[
key
]
:
null
}
function
setItem
(
key
,
value
)
{
store
[
key
]
=
value
}
function
clear
()
{
store
=
{}
}
That’s the first of many ES6 features that are aimed toward reducing complexity in the code you have to maintain. Once you get used to the syntax, you’ll notice that code readability and developer productivity get boosts as well.
Computed Property Names
Sometimes you have to declare objects that contain properties with names based on variables or other JavaScript expressions, as shown in the following piece of code written in ES5. For this example, assume that expertise
is provided to you as a function parameter, and is not a value you know beforehand:
var
expertise
=
'journalism'
var
person
=
{
name
:
'Sharon'
,
age
:
27
}
person
[
expertise
]
=
{
years
:
5
,
interests
:
[
'international'
,
'politics'
,
'internet'
]
}
Object literals in ES6 aren’t constrained to declarations with static names. With computed property names, you can wrap any expression in square brackets, and use that as the property name. When the declaration is reached, your expression is evaluated and used as the property name. The following example shows how the piece of code we just saw could declare the person
object in a single step, without having to resort to a second statement adding the person’s expertise
.
var
expertise
=
'journalism'
var
person
=
{
name
:
'Sharon'
,
age
:
27
,
[
expertise
]
:
{
years
:
5
,
interests
:
[
'international'
,
'politics'
,
'internet'
]
}
}
You can’t combine the property value shorthands with computed property names. Value shorthands are simple compile-time syntactic sugar that helps avoid repetition, while computed property names are evaluated at runtime. Given that we’re trying to mix these two incompatible features, the following example would throw a syntax error. In most cases this combination would lead to code that’s hard to interpret for other humans, so it’s probably a good thing that you can’t combine the two.
var
expertise
=
'journalism'
var
journalism
=
{
years
:
5
,
interests
:
[
'international'
,
'politics'
,
'internet'
]
}
var
person
=
{
name
:
'Sharon'
,
age
:
27
,
[
expertise
]
// this is a syntax error!
}
A common scenario for computed property names is when we want to add an entity to an object map that uses the entity.id
field as its keys, as shown next. Instead of having to have a third statement where we add the grocery
to the groceries
map, we can inline that declaration in the groceries
object literal itself.
var
grocery
=
{
id
:
'bananas'
,
name
:
'Bananas'
,
units
:
6
,
price
:
10
,
currency
:
'USD'
}
var
groceries
=
{
[
grocery
.
id
]
:
grocery
}
Another case may be whenever a function receives a parameter that it should then use to build out an object. In ES5 code, you’d need to allocate a variable declaring an object literal, then add the dynamic property, and then return the object. The following example shows exactly that, when creating an envelope that could later be used for Ajax messages that follow a convention: they have an error
property with a description when something goes wrong, and a success
property when things turn out okay:
function
getEnvelope
(
type
,
description
)
{
var
envelope
=
{
data
:
{}
}
envelope
[
type
]
=
description
return
envelope
}
Computed property names help us write the same function more concisely, using a single statement:
function
getEnvelope
(
type
,
description
)
{
return
{
data
:
{},
[
type
]
:
description
}
}
The last enhancement coming to object literals is about functions.
goto
statements, to indicate what instruction we should jump to; break
statements, to indicate the sequence we want to break out of; and continue
statements, to indicate the sequence we want to advance.