javascript的多根继承和多层继承
上篇文章贴出后又想了两个问题:
仔细一想,多层继承上篇文章的代码已经实现。多根继承则需要进一步完善extend方法。于是有了下面的代码,使用方法很简单。只要一句话可以轻松实现对多个父类的继承。下面是详细的示例源代码。欢迎交流,QQ:27234687 。读者可以自行修改后点【测试】按钮查看输出结果。 /** 多根继承方法, 参数可以支持多个父类参数 子类将按顺序继承所有父类的方法, 如果父类中有重复的方法则继承父类列表中在后面的类 父类的方法通过this.superClass.method()调用,可以调用所有父类方法 */ Object.prototype.extend = function(){ this.superClass={} for(var i=0;i<arguments.length;i++){ this.SuperClass=arguments[i]; this.SuperClass(); this.superClass.SuperClass=arguments[i]; this.superClass.SuperClass() } } //声明父类1:第一个方法show将得到继承,第二个方法将被覆盖 function SuperClass1(){ this.show=function(){ alert('Call SuperClass1.show()'); } this.override=function(){ alert('Call SuperClass1.override()'); } } //声明父类2:子类将继承speak方法 function SuperClass2(){ this.speak=function(){ alert('Call SuperClass2.speak()'); } } //声明子类:继承父类1和父类2,同时覆盖了父类1的方法override function SubClass(){ //调用继承方法继承父类的属性和方法 this.extend(SuperClass1,SuperClass2); this.override=function(){ alert("Call SubClass.override()。I will call my superClass's method SuperClass1.override()"); this.superClass.override(); } this.sing=function(){ alert('Call SubClass.sing()'); } } //子类的子类,多层继承展示:将通过继承SubClass得到SuperClass1和SuperClass2的方法以及SubClass的方法 function SubSubClass(){ this.extend(SubClass); this.talk=function(){ alert('call SubSubClass.talk()'); } } //测试子类的继承的结果: var s=new SubClass(); s.show(); //将调用SuperClass1的方法 s.speak(); //将调用SuperClass2的方法 s.override();//将调用SubClass的方法 s.sing();//将调用SubClass的sing方法 //测试孙类继承的结果: var s=new SubSubClass(); s.show(); //将调用SuperClass1的方法 s.speak(); //将调用SuperClass2的方法 s.override();//将调用SubClass的方法 s.sing();//将调用SubClass的sing方法 s.talk();//将调用SubSubClass.talk方法 测试
JAVASCRIPT继承方如此简单
看了很多的js继承方式都觉得不是很好,总是觉得不是很方便,用起来也不顺。所以一直在查这方面的资料思考这个问题,终于有所收获。忍不住要贴出来与大家共享,让大家一起享受javascript继承的快乐。优点:只要声明一个简单的函数即可方便使用JAVASCRIPT的继承,使用方法也只要一行代码调用继承方法即可,调用方式非常自然。 下面是示例源代码: <script> /** 首先给Object类添加继承方法extends, 前两句起继承父类的作用,使得调用的子类能够获得父类的所有属性和方法 后一句保存对一个对父类的引用,以便在需要的时候可以调用父类的方法 如果不需要使用父类的方法,最后一句可以删除 方法名不能为extends,因为IE认为是关键字不让用火狐下是可以的。属性superClass也不能用super,也是关键字。不然看起来就更舒服了(那就太像java了)。 */ Object.prototype.extend = function(SuperClass){ this.SuperClass=SuperClass; this.SuperClass(); this.superClass=new SuperClass(); } //下面是示例代码 //声明父类:第一个方法show将得到继承,第二个方法将被覆盖 function SuperClass(){ this.show=function(){ alert('Call SuperClass.show()'); } this.override=function(){ alert('Call SuperClass.override() width "superClass.override()"'); } } //声明子类:继承父类,同时覆盖了父类的方法override function SubClass(){ //调用继承方法继承父类的属性和方法 this.extend(SuperClass); this.override=function(){ alert('I have overrided SuperClass.override method.\nCall SubClass.override()'); } } //测试继承的结果: var s=new SubClass(); s.show(); //将调用父类的方法 s.override();//将调用子类覆盖后的方法 s.superClass.override();//将调用父类的override方法 </script>