技术开发 频道

那些应该吃透的JavaScript概念

  六,继承

  如果两个类都是同一个实例的类型,那么它们之间存在着某种关系,我们把同一个实例的类型之间的泛化关系称为继承。C#和JAVA中都有这个,具体的理解就不说了。在JavaScript中,并不直接从方法上支持继承,但是就像前面说的,可以模拟。

  方法可以归纳为四种:构造继承法,原型继承法,实例继承法和拷贝继承法。融会贯通之后,还有混合继续法,这是什么法,就是前面四种挑几种混着来。以下例子来源于王者归来,其中涉及到了apply,call和一些Array的用法,有兴趣的可以自己在园子里搜索一下。

  1.构造继续法例子:

//定义一个Collection类型  
functionCollection(size)
  {  this.size
=function(){returnsize};//公有方法,可以被继承  }   Collection.prototype.isEmpty=function(){//静态方法,不能被继承  returnthis.size()==0;  }  
//定义一个ArrayList类型,它"继承"Collection类型  functionArrayList()
  {
  varm_elements
=[];//私有成员,不能被继承  m_elements=Array.apply(m_elements,arguments);
  
//ArrayList类型继承Collection  this.base=Collection;
  this.base.call(this,m_elements.length);   this.add
=function()
  {
  returnm_elements.push.apply(m_elements,arguments);
  }
  this.toArray
=function()
  {  returnm_elements;  }
  }
   ArrayList.prototype.toString
=function()
  {
  returnthis.toArray().toString();
  }  
//定义一个SortedList类型,它继承ArrayList类型  functionSortedList()
  {
  
//SortedList类型继承ArrayList  this.base=ArrayList;
  this.base.apply(this,arguments);   this.sort
=function()
  {
  vararr
=this.toArray();
  arr.sort.apply(arr,arguments);
  }
  }  
//构造一个ArrayList
vara
=newArrayList(1,2,3);  
dwn(a);  
dwn(a.size());
//a从Collection继承了size()方法  dwn(a.isEmpty);//但是a没有继承到isEmpty()方法  
//构造一个SortedList  
varb
=newSortedList(3,1,2);  
b.add(
4,0);//b从ArrayList继承了add()方法  
dwn(b.toArray());
//b从ArrayList继承了toArray()方法  
b.sort();
//b自己实现的sort()方法  
dwn(b.toArray());  
dwn(b);  
dwn(b.size());
//b从Collection继承了size()方法

   2.原型继承法例子

//定义一个Point类型  
functionPoint(dimension)
  {
   this.dimension
=dimension;
  }
//定义一个Point2D类型,"继承"Point类型  functionPoint2D(x,y)
  {
  this.x
=x;
  this.y
=y;
  }  
Point2D.prototype.distance
=function()
  {
  returnMath.sqrt(this.x
*this.x+this.y*this.y);
  }  
Point2D.prototype
=newPoint(2);//Point2D继承了Point  
//定义一个Point3D类型,也继承Point类型  functionPoint3D(x,y,z)
  {  this.x
=x;  this.y=y;  this.z=z;  }  Point3D.prototype=newPoint(3);//Point3D也继承了Point
//构造一个Point2D对象  
varp1
=newPoint2D(0,0);  
//构造一个Point3D对象  
varp2
=newPoint3D(0,1,2);  
dwn(p1.dimension);  
dwn(p2.dimension);  
dwn(p1instanceofPoint2D);
//p1是一个Point2D  
dwn(p1instanceofPoint);
//p1也是一个Point  
dwn(p2instanceofPoint);
//p2是一个Point
0
相关文章