JavaScript的继承实现

面向对象编程中,继承是非常常用的用于功能间代码复用的方式,由于学习的都是经典的静态继承方式,所以对于JavaScript这种动态对象方式非常不理解,因为JavaScript没有类只有对象,其实中间的关键点在于对于动态的理解,所谓继承,就是子类要具有父类的相同功能,同时又具有自身所特有的功能,至于怎么得到父类的功能,那么就是两者的区别了,经典的静态继承结构,是由编译器在编译的时候建立起两者的关系,而JavaScript则如同两个数组的内容合并,先建立一个父类对象,再建立一个子类对象,然后把父类中的内容挨个拷贝到子类对象中。参考如下代码

function extend(subClass,superClass){
    var F = function(){};
    F.prototype = superClass.prototype;
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;
    subClass.prototype.parent = function(){};
    for (var fun in subClass.prototype) {
        if(typeof(subClass.prototype[fun])==='function')
            subClass.prototype.parent[fun] = subClass.prototype[fun];
    }
    if(superClass.prototype.constructor == Object.prototype.constructor){
       superClass.prototype.constructor = superClass;
    }
};

function SuperCls(name) {
    this.name = name;
}
SuperCls.prototype = {
    display: function() {
        console.log(this.name);
    }
}
function SubCls(name,age) {
    SuperCls.call(this,name);
    this.age = age;
}
extend(SubCls,SuperCls);//实现继承,其实就是把父类的内容拷贝到子类中
SuperCls.prototype.display = function() {
    this.parent.display.call(this);
  //复写函数会导致无法调用父类的同名函数,因为已经被复写了,所以在继承时,要创建两个父类对象
  //一个用于继承,一个放在parent属性内,用于复写后调用父类同名函数,以达到静态结构继承的复写功能
console.log(
'this is sub class and age is'+this.age); } var sup = new SuperCls('zhangsan'); sup.display(); var sub = new SubCls('lisi',16); sub.display();

 

posted @ 2017-07-12 07:39  筱溪飞鱼  阅读(158)  评论(0编辑  收藏  举报