Javascript继承

面向对象里最重要的两个特征:继承+多态
继承:子类共享父类的成员变量和方法

Javascript实现继承4种方法:

1.构造继承法
/*********************************************************/
/**ParentClass***/
function Collection(size)
{
 //公共方法,能被继承
 this.size = function(){
     retrurn size()};
    }
 this.toString = function(){
     return typeof(this);
 }      
}
 
//静态函数
Collection.prototype.isEmpty = function(){
 return this.size() == 0;     
}
/**ChildClass***/
function ArrayList() {
 //私有成员,不能被继承
 var elements = [];
 //ArrayList继承Collection
 this.base = Collection;
 this.base.call(this,function(){return elements.length});
 //新增方法
 this.add = function()
 { //通过反射,调用函数
  return elements.push.apply(elements,arguments);
 }
 this.toArray = function()
 {
  return elements;
 }
}
//静态方法,重载Collection.toString方法
ArrayList.prototype.toString = function(){
 return this.toArray().join(" ");
}
/**********************************************************/
解说:
为了实现变量和方法的共享,通过在子类通过反射调用父类的构造函数
this.base.call(this,function(){return elements.length})
实现共享父类的公共成员,在执行父类构造函数时
this.size = function(){return size();}
this所指向的对象句柄是子类的对象句柄(通过反射调用的父类构造函数时,
传递的对象句柄this,是子类的对象句柄)

2.原型继承法
利用Javascript的原型链,实现单一继承。
补充说明:Javascript原型链是用于记录对象的基于原型的继承关系,
在访问对象成员时,在查找时,按照原型关系从原型链最底层依次查找
/*********************************************************/
/***ParentClass***/
function Point(dimension)
{
 //公有成员函数
 this.dimension = function(){return demension;}
}
/***ChildClass1***/
function Point2D(x,y)
{
 this.x = x;
 this.y = y;
}
// Point2D 继承 Point
Point2D.prototype = new Point(2);

/***ChildClass2***/
function Point3D(x,y,z)
{
 this.x = x;
 this.y = y;
 this.z = z;
}
// Point3D 继承 Point
Point3D.prototype = new Point(3);
/****************************************************/
解说:
Point2D 原型链: Point2D->Point->object
Point3D 原型链: Point3D->Point->object
例:
var 2d = new Point2D(1,2);
var dimension = 2d.demension();
在执行2d.demension()时,
查找顺序如下:
-1>首先查找2d对象中是否定义了demension方法,如果不存在,继续查找
-2>再次查找2d对象的原型对象(Point对象)是否定义demension方法,如果不存在,继续查找
-3>最后查找Point对象的原型是否定义demension方法,如果不存在,typeof(demension) == undefined
注意:
var 2d1 = new Point2D(1,2);
var 2d2 = new Point2D(2,1);
2d1对象和2d2对象拥有同样的原型链,所有同一类型的对象拥有共同的原型链

3.实例继承法
实例继承法,通过在闭包中,修改对象属性,保留原对象句柄,以实现继承原对象
/*************************************************/
function MyDate()
{
 var instance = new Date();
 instance.printDate = function()
 {
  document.write("<p>"+instance.toLocalString()+"</p>");
 }
 
 return instance;
}
/**************************************************/
解说:
在闭包中,新建的Date对象,拥有Date的所有成员,
为新建的实例对象增加了printDate函数方法,返回该对象,
实现了Date的继承。

4.拷贝继承法
/**************************************************/
拷贝继承法,通过遍历对象属性,以实现对象的成员拷贝,继而实现继承
function.prototype.extends = function(obj)
{
 for(var index in obj)
 {
  this.prototype[each] = obj[each];
 }
}

var Point2D = function();
Point2D.extends(new Point());
效率低
/**************************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值