龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

浅析JavaScript继承方式(1)(3)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
继承工具函数四 这种方式是目前比较流行的,51ditu网站的开发就是按照这种模式的。 /** *@param{Function}subCls子类 *@param{Function}superCls父类 */ function extend(su

继承工具函数四

这种方式是目前比较流行的,51ditu网站的开发就是按照这种模式的。

  1. /**  
  2.  * @param {Function} subCls 子类  
  3.  * @param {Function} superCls 父类  
  4.  */ 
  5. function extend(subCls,superCls) {    
  6.     //暂存子类原型  
  7.     var sbp = subCls.prototype;  
  8.     //重写子类原型--原型继承  
  9.     subCls.prototype = new superCls();  
  10.     //重写后一定要将constructor指回subCls  
  11.     subCls.prototype.constructor = subCls;  
  12.     //还原子类原型  
  13.     for(var atr in sbp) {  
  14.         subCls.prototype[atr] = sbp[atr];  
  15.     }  
  16.     //暂存父类    
  17.     subCls.supr = superCls;  

按 构造函数+原型 方式写类,即属性挂在this上,方法挂在prototype上。

  1. /**  
  2.  *  父类Person  
  3.  */ 
  4. function Person(nationality){  
  5.     this.nationality = nationality;  
  6. }  
  7. Person.prototype.getNationality = function() {return this.nationality;}  
  8. Person.prototype.setNationality = function(n) { this.nationality = n;}  
  9.  
  10. /**  
  11.  *  子类Man  
  12.  */ 
  13. function Man(nationality,name) {  
  14.     Man.supr.call(this,nationality); //很重要的一句,调用父类构造器  
  15.     this.name = name;  
  16. }  
  17. Man.prototype.getName = function() {return this.name;}  
  18. Man.prototype.setName = function(n) {this.name=n;} 

注意子类Man中要显示的调用父类构造器已完成父类的属性/字段拷贝。

extend调用,创建Man的实例

  1. extend(Man,Person);  
  2. var m = new Man('USA','jack');  
  3. console.log(m);  
  4. m.setName('lily');  
  5. console.log(m.name); 

继承工具函数五

  1. /**  
  2.  * @param {String} className  
  3.  * @param {String/Function} superClass  
  4.  * @param {Function} classImp  
  5.  */ 
  6. function $class(className, superClass, classImp){  
  7.     if(superClass === "") superClass = Object;  
  8.     var clazz = function(){  
  9.         return function(){  
  10.             if(typeof this.init == "function"){  
  11.                 this.init.apply(this, arguments);  
  12.             }  
  13.         };  
  14.     }();  
  15.     var p = clazz.prototype = new superClass();  
  16.     var _super = superClass.prototype;  
  17.     window[className] = clazz;  
  18.     classImp.apply(p, [_super]);  

定义父类Person

  1. /**  
  2.  * 父类 Person  
  3.  */ 
  4. $class('Person','',function(){  
  5.     this.init = function(name){  
  6.         this.name = name;  
  7.     };  
  8.     this.getName = function(){  
  9.         return this.name;  
  10.     };  
  11.     this.setName = function(name){  
  12.         this.name = name;  
  13.     }  
  14. }); 

子类Man

  1. /**  
  2.  * 子类 Man  
  3.  */ 
  4. $class('Man', Person, function(supr){  
  5.     this.init = function(name, age){  
  6.         supr.init.apply(this,[name]); // 该句很重要  
  7.         this.age = age;  
  8.     };  
  9.     this.getAge = function(){  
  10.         return this.age;  
  11.     };  
  12.     this.setAge = function(age){  
  13.         this.age = age;  
  14.     };  
  15. });  
  16. var m = new Man('Jack',25);  
  17. console.log(m.name); // Jack  
  18. console.log(m.age); // 25 

从输出看可以看到子类Man的确继承了父类的属性和方法。

原文链接:http://www.cnblogs.com/snandy/archive/2011/03/09/1977804.html

精彩图集

赞助商链接