从Java的角度理解Ext的extend

发表于:2011-12-29 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Adley    来源:51Testing软件测试网采编

  在Java中,我们在实现继承的时候存在下面几个事实:

  1、准备两个类,他们用extends关键字链接起来

  2、如果超类没有默认构造函数,需要在子类构造函数中显式的super并传参,如果都是默认构造函数也可以super,不super虚拟机是自动的

  3、子类可追加,覆盖,重载方法,子类可以有自己的私有属性,他们在子类构造函数中被构造

  4、字段是数据,方法在代码区,和类建立方法表,同一个类的对象有自己的数据但是共享方法代码

  比如有两个类,Plane和Space,Plane表示平面,Space表示空间,Space是Plane的子类,在java中

  1. /** 
  2.  * 根据字段数量分配内存块 
  3.  * 实例化的时候虚拟机调用Plane.Plane方法把这个内存块作为this和构造参数传进去,初始化完数据字段。 
  4.  * 建立方法表映射 
  5.  */ 
  6. class Plane {  
  7.     protected int x;  
  8.     protected int y;  
  9.     Plane(int x, int y) {  
  10.         this.x = x;  
  11.         this.y = y;  
  12.     }  
  13.     public void XY() {  
  14.         System.out.println(x * y);  
  15.     }  
  16. }  
  17. /** 
  18.  * 自动拥有了超类的行为,但是超类的属性需要超类去构造 
  19.  * 子类可构造自己的属性,添加自己的方法,覆盖超类的方法 
  20.  * <p/> 
  21.  * 按照继承结构的所有字段分配内存块,调用Space.Space将这个内存块作为this和参数一起传进去 
  22.  * 把超类的那部分给超类,然后自己初始化自己的。 
  23.  * <p/> 
  24.  * 建立方法表 
  25.  */ 
  26. class Space extends Plane {  
  27.     private int z;  
  28.     Space(int x, int y, int z) {  
  29.         super(x, y);  
  30.         this.z = z;  
  31.     }  
  32.     public void XYZ() {  
  33.         System.out.println(x * y * z);  
  34.     }  
  35. }  
  36. public class Test {  
  37.     public static void main(String[] args) {  
  38.         Plane plane = new Plane(2,3);  
  39.         plane.XY();  
  40.         Space space = new Space(234);  
  41.         space.XYZ();  
  42.     }  
  43. }

  那么在js中也一样,区别是代码要放到构造函数(可以理解为Java中的类)的原型上,原型是放置方法和不变属性的理想场所,原型是一个对象,它和普通对象唯一不同的就是他有一个constructor属性指向它所依附的构造器,在java中子类查找属性和方法是通过虚拟机来完成,但是在js中需要通过原型链来完成。也就是说继承关系对程序员是不透明的,需要了解这个原型机制,原型机制上存在两条链,一是原型链,二是构造函数链。

  仿照上面java的代码,我们可以完成js的写法,如下:

  1. var Plane = function(x, y) {  
  2.     this.x = x;  
  3.     this.y = y;  
  4. };  
  5. Plane.prototype.XY = function() {  
  6.     alert(this.x * this.y);  
  7. };  
  8. var Space = function(x, y, z) {  
  9.     //用this调用超类构造函数,没有java的super自动调用,所以要手动调用 
  10.     Plane.call(this, x, y);  
  11.     //Space.superclass.constructor.call(this, x, y); 可以用一个统一的语法 
  12.     //构造自己的数据 
  13.     this.z = z;  
  14. };  
  15. Space.prototype.XYZ = function() {  
  16.     alert(this.x * this.y * this.z);  
  17. }

  JS中函数的this指函数的调用者,不管是java还是js,this都可理解为新分配的那段容纳对象的内存。在java中通过SpaceextendsPlane,虚拟机就维护好了他们的继承关系以完成继承关系的自动查找,但是在js中需要我们手动的处理,在这个时候Space是调用不到XY这个方法的,因为他们没有在原型链上。我们可以开发一个函数来模拟java的关键字extends,比如这个函数叫做extend,通过执行extend(Plane,Space)完成原型链的组装。

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号