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.
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.
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.
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
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
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.
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.
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.
You want to learn Google Apps Script?
Learning Apps Script, (and transitioning from VBA) are covered comprehensively in my my book, Going Gas - from VBA to Apps script, available All formats are available now from O'Reilly,Amazon and all good bookshops. You can also read a preview on O'Reilly.
Services > Desktop Liberation - the definitive resource for Google Apps Script and Microsoft Office automation > Going Gas >