Saturday, October 25, 2014

Introduction

I have implemented Object-Oriented classes in JavaScript, want to share with you my experience. As we know that there's no keyword like "class",  "extends", "implements" etc. in JavaScript. But  still we can achieve up to some extent. JavaScript function are first-class-objects which can store logic and data, and we are going to implement classes using JavaScript functions.

I have used __proto__ property for inheritance, this is the standard property according to ECMAScript 6.
Please find more information about __proto__  here.
https://people.mozilla.org/~jorendorff/es6-draft.html

Code

We are going to create two classes, Employee and Manager, Manager class inherit all the properties of  Employee class.  Let's see the code

Employee = function(id, name, age){
    this.empId = id;
    this.name = name; 
    this.age = age;
    alert('A Employee is created.');
}


// Let's add two methods in Employee class, Even it is not  relevant but we are adding just to achieve inheritance. Note, please do not override prototype object, just add in new methods in that object. Another way you won't get recognize the class name in debugger.

Employee.prototype.getName =  function() { return this.name; };
Employee.prototype.getAge =  function() { return this.age; };


Before moving further we need to define our extend function which we are going to use for inheritance. As all JavaScript programmer know that we have to do special handling for IE, we did the same here.
extend = function (subClass, baseClass) {
     if (navigator.appVersion.indexOf("MSIE") == -1) {
         // it gives the clear picture of object hierarchy during debugging, but this code runs only on Firefox and chrome.
         subClass.prototype.__proto__ = baseClass.prototype;
     }
     else {
         // special handing for IE 9/10 etc.
         function inheritance() { }
         inheritance.prototype = baseClass.prototype;
         subClass.prototype = new inheritance();
         // store constructor as it is
         subClass.prototype.constructor = subClass;
     }
};

Now, we are going to define Manager class 

Manager = function(empId, name, age, resources) {
    Employee.call(this, empId, name, age);
    this.resources= resources;  // no. of resources managed by Manager
    alert('A manager has been created.');
}
First extend all the properties of base class and then defines for current class
extend(Manager, Employee);

Manager.prototype.getResources= function() {
    // This alert shows that we can access all members of base class and sub class
    // alert('I am ' + this.name + " and managing " + this.resources + " resources");
    return this.resources;
}

Please find clear picture of inheritance in debugger



It is time to see the result of  the above code, let's create object of Manager class and access all the properties and functions

var manager = new Manager(1, 'Anurag Singh', 30, '7');

Get the employee Id of manager, this is defined in Employee class

alert(manager.empId);  

Get the age of manager, this function is defined in Employee class

alert(manager.getAge())

Now, get the no. of resources manages by manager

alert('I am ' + manager.getName() + " and managing " + manager.getResources() + " resources");


This the simple way we may achieve object-oriented approach in JavaScript.
Please note that functions we defined in individual class may not relevant, we used here for sample only.