JavaScript的继承有很多种方式实现,一般有

  • 构造函数的继承
  • 非构造函数的继承

而JavaScript的多态可以用继承来达到。
参考了一些资料,集合自己的应用场景,写了一个比较通用的基础代码:

/**
 * javascript oop class extend
 * @desc:class create and extends, the created class need define the method 'init' at least in its prototype
 * @author:dailey.dai@outlook.com
 * @date:2015/06/18
 * @param win window 
 */
(function(win){
    if (!win['classes']) { //define class cache, user defined class could push in the map
        win['classes'] = {};// user can use the map to define a factory class
    };
    if (!win['Class']) {
        win['Class'] = { //define Class object
            create: function() {
                return function() {
                    this.init.apply(this, arguments);
                }
            },
            extend: function(parentClass, extendObj) {// class inherit
                var childClass = Class.create();
                var F = function() {};
                F.prototype = parentClass.prototype;
                childClass.prototype = new F();
                childClass.prototype.constructor = childClass;
                if (extendObj){
                     for(var item in extendObj){
                         if(extendObj.hasOwnProperty(item)){
                             childClass.prototype[item] = extendObj[item];
                         }
                     }
                }
                childClass.prototype.uber = F.prototype;
                return childClass;
            }
        }
    }; //end of define Class object
})(window);

下面看看如何使用:
创建一个类,其实JavaScript里没有类这个概念,一切都是对象,这就是为什么叫 object-based.这里我们暂且从语义上叫做类。

// define class name
var Person = Class.create();
// define class method and attribute
Person.prototype = {
    init:function(name,age,sex){//this method must be defined
        this._name = name;//define attribute
        this._age = age;
        this._sex = sex;
    },
    showInfo:function(){
        console.log(this._name+','+this._age+','+this._sex);
    }
}

现在,定义了一个Person类,有3个属性以及两个方法,其中init方法是必须要声明的,这里作用类似构造函数,在new时会调用这个方法。
创建类的对象,并调用方法。

// new a instance of Person
var peter_P = new Person('Peter Pan',25,'male');
peter_P.showInfo();    //    Peter Pan,25,male

如何创建子类,这里我们再定义一个类Student,继承Person父类。

// define a class which inherit from Person
var Student = Class.extend(Person,{
    study:function(){
        console.log("I am studying now!!!");
    }
});
/* 
// also can define subclass by this way
var Student = Class.extend(Person);
Student.prototype.study=function(){
    console.log("I am studying now!!!");
}
*/
// new a instance of Student
var lucy_S = new Student('Lucy Li',20,'female');
lucy_S.showInfo(); //    Lucy Li,20,female
lucy_S.study(); //    Lucy Li,20,female

如何在子类中重写父类的方法,一边实现面向对象的多态。

var Doctor = Class.extend(Person,{
    init:function(name,age,sex,depart){//overwrite init function
        //call parent init function to initial basic attribute
        this.uber.init.call(this,name,age,sex);
        /*
        //also can call parent init function directly
        Person.prototype.init.call(this,name,age,sex);
        */
        this._depart = depart;
    },
    showInfo:function(){//overwrite showInfo function
        console.log(this._name+','+this._age+','+this._sex+','+this._depart);
    },
    work:function(){
        console.log("I am working!!!");
    }
});
// new a instance of Doctor
var socct_D = new Doctor('Socct',40,'male','surgery');
socct_D.showInfo(); //    Socct,40,male,surgery
socct_D.work(); //    I am working!!!

这里要注意这行代码

this.uber.init.call(this,name,age,sex)

this.uber 是指向父类的原型,这里其实就是在子类里调用父类的方法
另外,在JavaScript中是没有方法重载的,只有一个同名的方法有效,后来定义的同名方法会覆盖之前定义的。

到了这里,其实多态已经体现出来。明显的代码看下面

function display(person){
    person.showInfo();
}
var person = new Student('Lucy Li',20,'female');
display(person); //    Lucy Li,20,female
person = new Doctor('Socct',40,'male','surgery');
display(person); //    Socct,40,male,surgery

Ok, 如何使用这段基础代码来达到JavaScript的继承和多态就完成了,目前一般的应用基本满足。

附上参考的资料
Javascript面向对象编程(二):构造函数的继承
Javascript面向对象编程(三):非构造函数的继承
耕书录-javascript实现类、继承、多态