面向对象里最重要的两个特征:继承+多态
继承:子类共享父类的成员变量和方法
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());
效率低
/**************************************************/
继承:子类共享父类的成员变量和方法
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());
效率低
/**************************************************/