These articles are abridged from my book on Learning Apps Script and Office to Apps migration.

Going GAS, from VBA to Google Apps Script.

Available in ebook or print from O’Reilly or Amazon or any other good bookshop.

ECMAScript 5 introduced a new way of creating objects, giving better control over properties and bringing some standardization. Apps Script is based on ECMAScript 3, but it also has some things from ES5, including Object.create.

Here’s how to use it.

Usual way to create objects.

We are all used to creating objects like this,

or by using a constructor, along with the new keyword.

or modifying the function prototype of the constructor

Another technique is to base one constructor on another

and so on. There are many different techniques, some more complicated than others.

Using Object.create

An object can be created like this
The specific properties object has all the capabilities of Object.defineProperties such as enumerability, writability and getters and setters, and is used to create properties specific to the object being created.

thePrototype refers to the object to use as a protoype, and a null value will use the default, the  Object prototype.

Creating a prototype.

It’s fairly easy to see how a standalone object can be created, but you can also use this to create objects which use other objects as prototypes. In this example, I’ll create a prototype containing a couple of properties that are shared amongst all mammals, along with a getter property to summarize the object, and a build function that I’ll use in the place of a constructor and the new keyword.
Stringifying this object gives this.

Here’s another based on Mammal as a prototype, but with additional properties specific to a land Mammal.

which stringifies to this

And another, with properties specific to a sea mammal

which stringifies to this

Creating object instances

Animal specific objects can now be created with the two Prototype chains  (SeaMammal -> Mammal – > Object) and (LandMammal -> Mammal -> Object),
You’ll notice that the build function in the Mammal prototype dispenses with the need for any kind of constructor function (or the use of the new keyword) with any of these objects. Even though the build function is defined at the top of the prototype chain in the Mammal object, the animal specific properties belong to the animal object, as stringified below.

In the same way, animal specific objects using the SeaMammal as a prototype can be created like this.

and produce this kind of stringification

Using getters

When getters or setters are defined, it is not necessary to treat them as a function. This means that complicated things can be returned as properties without needing to know it’s a function. In Apps script, getSomething() and setSomething() are the standard naming convention and also signal that these are functions.
Using getters and setters with ES5, means that you treat everything as if it were a property.
The introduction getter in the Mammal Object is called like this, even though it is actually a function behind the scenes, as in the examples below.

Stringifying the prototype chain.

When the prototype chain is searched for a property it keeps going higher up the chain until it finds it, or runs out of prototypes. You’ll have noticed that when stringifying the objects created above, only the properties of the current object are enumerable and visible.
Object.getPrototypeOf can be used to return the prototype of an object, and it can be of course be stringified too. Here’s how to get the stringified results of all each of the members of the prototype chain for our animal specific object.

Generalizing prototype chain stringification

You may want to combine all the enumerable properties in the prototype chain. It’s pretty straightforward to do that recursively. Here’s a function that can be used to combine all properties of a prototype chain. If there are duplicates the lower ones take precedence – so this pretty much emulates what traversing a prototype chain would look like internally to JavaScript.
and it can be used like this
I really like this way of dealing with inheritance and object creation. It’s nice to see Apps Script moving forward.

For more like this see Google Apps Scripts Snippets
Why not join our forum, follow the blog or follow me on Twitter to ensure you get updates when they are available.