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();