Object Oriented JavaScript – Quick Reference
Posted by Paul on 8th December 2009
Object Definition and Creation
Constructor-based Creation
var Example = function(val) {
this.foo = val;
}
var example = new Example('something');
// Although it's unusual to see to this technique, new instances of
// Example may be created using Example's built-in constructor property:
var anotherExample = new example.constructor('something else');
JSON-based Creation
var example = {
foo: 'something'
};
Non-shared Member Attributes
var Example = function() {
// Each instance of Example gets its own copy of the foo() function.
this.foo = function() { ... };
};
Shared Member Attributes
var Example = function() {};
// Add a shared foo() function attribute to all past and future instances
// of Example.
Example.prototype.foo = function() { ... };
Note that when declaring a shared function on an object’s prototype, any constructor-scoped varaibles will not be accessible from within the shared function – e.g. foo, declared inside the Example constructor function, will not be directly available from within foo().
Function Access to the Parent ‘this’
var Example = function() {
var that = this;
this.foo = '';
var bar = function(val) {
// Because inner functions have their own 'this' attribute, the
// parent object's 'this' attribute is obscured. A common
// workaround is to assign 'this' to a variable (conventionally
// named 'that' at parent scope:
that.foo = val;
}
};
Object Inheritance
JavaScript is a very flexible language and although it does not have the classical inheritance mechanisms of, say, Java and C++, there are a number of commonly used JavaScript idioms that are used to provide object inheritance. Two common techniques are shown below.
Start with a base object, Animal:
var Animal = function() { ... };
Animal.prototype.getLegCount = function() { ... };
Prototype Chaining
var Cat = function() { ... };
Cat.prototype.meow = function() { ... };
// Prototype chaining allows Cat to inherit from Animal.
Cat.prototype = new Animal();
// New instances of Cat are created using the ‘new’ operator.
var fluffy = new Cat();
Parasitic Inheritance
var Dog = function() {
var that = new Animal();
// parasitic extension of Animal...
that.woof = function() { ... };
return that;
};
// New instances of Dog are created using the 'new' operator.
var spot = new Dog();
Because the `Dog` constructor function returns an object, the new operator will use that object as its result, assigning it to the variable spot, above (see Step 9 of Construct in ECMAScript Language Specification).