In my last post, Understanding Prototypes, you learned that you can use prototypes to implement inheritance. In this post, I will agree with Javier Uria and Pedro Teixeira who posts on MetaDuck, who advocates a way to implement inheritance using the revealing module pattern.
In this approach, you expose the methods of the parent object as you do in any revealing module pattern object. Then in the derived object, you include the variables whose methods and properties you want to expose. You can override a method in the derived object, which is shown in the example.
function Parent(name) { // Private variables here var myName; // Constructor myName = name; // Public interface return { func1: function () {alert("Parent func1. Name: " + myName); }, func2: function () {alert("Parent func2. Name: " + myName); } } } function Child(name) { // Private variables here var myName, exportObj; // Constructor // Inherit exportObj = Parent(name + "'s father"); // Override exportObj.func2 = function () { alert("Child func2. Name: " + name); } // Export public interface return exportObj; }
Here is the code as a gist:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Parent(name) { | |
// Private variables here | |
var myName; | |
// Constructor | |
myName = name; | |
// Public interface | |
return { | |
func1: function () {alert("Parent func1. Name: " + myName); }, | |
func2: function () {alert("Parent func2. Name: " + myName); } | |
} | |
} | |
function Child(name) { | |
// Private variables here | |
var myName, | |
exportObj; | |
// Constructor | |
// Inherit | |
exportObj = Parent(name + "'s father"); | |
// Override | |
exportObj.func2 = function () { | |
alert("Child func2. Name: " + name); | |
} | |
// Export public interface | |
return exportObj; | |
} | |
var child = Child("John"); | |
child.func1(); | |
child.func2(); |
The code produces:
Parent func2. Name: John’s father Child func2. Name: John
Of course, you can add additional methods and properties on the child object.