Great, great Q&A on prototypes (and therefore inheritance). READ THIS FIRST!
Very long and in-depth article on OOP in JavaScript including data types, constructors, prototypes, inheritance, and properties.
This StackOverflow answer has a very good description of Prototype inheritance and Closure inheritance.
The standard paradigm, is to use the prototype chain to implement the inheritance of methods from a super class. Any methods defined on the sub-class will supersede those defined on the super-class.
function A() { // Define super class
this.x = 1;
}
A.prototype.DoIt = function() { // Define Method
this.x += 1;
}
function B() {
A.call(this); // Call super-class constructor (if desired)
this.y = 2;
}
B.prototype = new A; // Define sub-class
B.prototype.constructor = B;
B.prototype.DoIt = function() { // Define Method
A.prototype.DoIt.call(this); // Call super-class method (if desired)
this.y += 1;
}
// instantiate and test
b = new B;
document.write((b instanceof A) + ', ' + (b instanceof B) + '<BR/>'); //true, true
b.DoIt();
document.write(b.x + ', ' + b.y); //2, 3
Something to keep in mind is that each time a sub-class is defined, we explicitly call the constructor of the super-class in order to insert it into our prototype chain. So it is important to ensure that no undesirable side-effects will occur when this call is made. Conversely, if the super-class constructor should be called for each instance of every sub-class, code must be explicitly added to the sub-class's constructor to make this call (as is done in the above example).
For a working example (similar to the above code), check out the Prototypes page.
Here's another example:
var Pet = function(name) {
this.name = name;
this.sound = "silence";
}
Pet.prototype.makeSound = function() {
alert(this.name + " says " + this.sound);
}
var Cat = function(name, sound) {
Pet.call(this, name);
this.sound = sound;
}
Cat.prototype = new Pet;
Cat.prototype.constructor = Cat;
Cat.prototype.purr = function () {
alert('purr, purr');
}
var maria = new Cat("Maria", "meow");
maria.makeSound();
maria.purr();