Click here to Skip to main content
Click here to Skip to main content

Polymorphism in JavaScript

By , 16 Jan 2012
 

Introduction

Polymorphism in Object-Oriented Programming is the ability to create a variable, a function, or an object that has more than one form.

Background

The primary usage of Polymorphism in Object-Oriented Programming is the ability of objects belonging to different types to respond to methods, fields, or property calls of the same name, each one according to an appropriate type-specific behaviour.

The programmer does not have to know the exact type of the object in advance, and so the exact behaviour is determined at run-time. This is what we call late binding or dynamic binding (this make Polymorphism a very cool feature). Requirements are such that, there must be properties with the same name and the same parameter sets in all the superclasses, subclasses and interfaces.

Using the code

As far as JavaScript is concerned, we really don’t have interfaces as in other programming languages but we do have superclasses and subclasses. Going back to my article on JavaScript Inheritance, we have created classes that inherit from others.

Let’s reuse the same example, this time we will create a class Person then another class called Manager that inherits from Person. Both classes will include a method called wake_up(). We will then create objects of both types and put them in an array.

When we loop through that array, the system will call the function wake_up() on each of the objects and the implementation will be determined dynamically.

Let’s define our class Person.

  Person = function (id, name, age) {
            this.id = id;
            this.name = name;
            this.age = age;
           // alert('A new person has been accepted');
        }
        /* definition of our Person class */
        Person.prototype = {
            /** wake person up */
            wake_up: function () {
                alert('A person is awake');
            },
            /** retrieve person's age */
            get_age: function () {
                return this.age;
            }
        }

Now let us create an Inheritance class so that other classes can inherit from our class person. For more details and demo on inheritance, refer to my article on JavaScript Inheritance by clicking here.

Inheritance_Manager = {};  
           
Inheritance_Manager.extend = function (subClass, baseClass) { 
                function inheritance() { }
                inheritance.prototype = baseClass.prototype;
                subClass.prototype = new inheritance();
                subClass.prototype.constructor = subClass;
                subClass.baseConstructor = baseClass;
                subClass.superClass = baseClass.prototype; }

Ok we are then going to define our class Manager as follows:

Manager = function (id, name, age, salary) {
          Manager.baseConstructor.call(this, id, name, age);
          this.salary = salary;
          // alert('A manager has been registered.'); 
}

Our class Manager will inherit from Person as follows:

Inheritance_Manager.extend(Manager, Person);

Let’s add more functionality and overwrite our wake_up() function

 Manager.prototype = {
    wake_up: function () {
        alert('I am in control with Polymorphism');
    }
 }

Now we create an array and store in objects of type Person and Manager.

var arrPeople = new Array();
arrPeople[0] = new Person(1, 'Joe Tester', 26);
arrPeople[1] = new Manager(1, 'Joe Tester', 26, '20.000');

See how the function wake_up() behaves based on the different objects we have. This is what we call Polymorphism. Polymorphism makes things so simple when you have many objects that present the same interface but different implementations.

for (var i in arrPeople) {
   arrPeople[i].wake_up();
   alert(arrPeople[i].get_age());
}

Many people don’t believe that JavaScript is fully-fledged Object Oriented Programming Language but I think JavaScript just does things its own way which is different from other languages. As we can see in the case of Polymorphism here, there is no difference with other programming languages. So it is fully polymorphic.

Here is the complete code:

     /** This is our Person class */
            Person = function (id, name, age) {
                this.id = id;
                this.name = name;
                this.age = age;
               // alert('A new person has been accepted');
            }
            /* definition of our Person class */
            Person.prototype = {
                /** wake person up */
                wake_up: function () {
                    alert('A person is awake');
                },
                /** retrieve person's age */
                get_age: function () {
                    return this.age;
                }
            }    

            Inheritance_Manager = {};   

            Inheritance_Manager.extend = function (subClass, baseClass) { 
                function inheritance() { }
                inheritance.prototype = baseClass.prototype;
                subClass.prototype = new inheritance();
                subClass.prototype.constructor = subClass;
                subClass.baseConstructor = baseClass;
                subClass.superClass = baseClass.prototype;
            }    

            Manager = function (id, name, age, salary) {
                Manager.baseConstructor.call(this, id, name, age);
                this.salary = salary;
               // alert('A manager has been registered.');
            }    

            Inheritance_Manager.extend(Manager, Person);    

            Manager.prototype = {
                wake_up: function () {
                    alert('I am in control');
                }
            }    

            var arrPeople = new Array(); 
            arrPeople[0] = new Person(1, 'Joe Tester', 26);
            arrPeople[1] = new Manager(1, 'Joe Tester', 26, '20.000');    

            for (var i in arrPeople) {
                arrPeople[i].wake_up();
                alert(arrPeople[i].get_age());
            }

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Joe BTrez
Other Cyberminds Ltd
United Kingdom United Kingdom
Member
I am a senior software Consultant and have been working in IT for the past 6 years.
I started as a junior web developer back in 2006 then was promoted to a full developer a year later then a senior developer some years later.
I have held positions as Scrum Master and I am currently working as a software consultant.
Throughout my experience as a web developer, I have spent a lot of time doing both front and back end development.
I have got experience in the following technologies:
ASP.Net 2+, C#, SQL Server 2005+, Java, SilverLight
 
As far as front-end development is concerned, I am experienced in CSS, JavaScript, XHTML etc...

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionHow was this polymorphism?memberDaniel Gidman16 Jan '12 - 5:12 
This article didn't touch polymorphism so much as inheritance.
 
I think of polymorphism more in terms of an interface rather than sub classes. This separates the concept of inheritance out of the equation. Javascript can not implement a true interface to my knowledge, however via convention you can implement interfaces (same method signatures on unrelated objects). So, in effect, Javascript is polymorphic by its very nature. We can call the same method signatures on MANY different unrelated types. There is no compile time enforcement of it but polymorphism only calls for the ability, not the safety in doing so.
AnswerRe: How was this polymorphism?memberJoe BTrez16 Jan '12 - 5:51 
Hi Daniel,
Thanks for your reply but I think you are missing the point here. I was talking about Polymorphism in JavaScript and I started a general overview of what Polymorphism is.
 
Polymorphism is the ability of an action or method to do different things based on the object that it is acting upon. This is the third basic principle of object oriented programming. Overloading, overriding and dynamic method binding are some aspects of Polymorphism.
Now tell me how you could override a method in JavaScript without using inheritance (subclasses) in the first place.
You could certainly have objects of different type and give them different implementations of methods with the same signature. In the same way you could do it by making one object inherit from the other.
I hope this makes things clearer.
Thanks.
QuestionRe: How was this polymorphism?memberDaniel Gidman16 Jan '12 - 10:49 
Sheesh, its been years since I had to get into the base theory,
 
Yah reading up again on polymorphism, you do present one kind of polymorphism. How about the other kinds as described by Polymorphism_(computer_science)[^]

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130523.1 | Last Updated 16 Jan 2012
Article Copyright 2012 by Joe BTrez
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid