JavaScript 继承的方法总结

<script type="text/javascript">

//方法可以归纳为四种:构造继承法,原型继承法,实例继承法和拷贝继承法
//+++++++++++++++++++++++++++++++++++++++++
//1. 构造继续法
//+++++++++++++++++++++++++++++++++++++++++
function Collection(size){
	this.size = function(){return size};  //公有方法,可以被继承
}
 
Collection.prototype.isEmpty = function(){  //静态方法,不能被继承
	return this.size() == 0;
}
 
//定义一个ArrayList类型,它"继承"Collection类型
function ArrayList(){
	var elements = []; //私有成员,不能被继承
	elements = Array.apply(elements, arguments);
	//ArrayList类型继承Collection
  	this.base = Collection;
  	this.base.call(this, elements.length);
 
  	this.add = function(){
   		return elements.push.apply(elements, arguments);
  	} 
	
  	this.toArray = function(){
   		return elements;
  	}
}

ArrayList.prototype.toString = function(){
	return this.toArray().toString();
}

//定义一个SortedList类型,它继承ArrayList类型
function SortedList(){
	//SortedList类型继承ArrayList
	this.base = ArrayList;
	this.base.apply(this, arguments);
	this.sort = function(){
   		var arr = this.toArray();
   		arr.sort.apply(arr, arguments);
  	}
}

function test1(){
	//构造一个ArrayList
	var a = new ArrayList(1,2,3);
	println(a);
	println(a.size()); //a从Collection继承了size()方法
	println(a.isEmpty); //但是a没有继承到isEmpty()方法
	//构造一个SortedList
	var b = new SortedList(3,1,2);
	b.add(4,0); //b 从ArrayList继承了add()方法
	println(b.toArray()); //b 从ArrayList继承了toArray()方法
	b.sort();  //b 自己实现的sort()方法
	println(b.toArray());
	println(b);
	println(b.size()); //b从Collection继承了size()方法
}


//+++++++++++++++++++++++++++++++++++++++++
//2. 原型继承法
//+++++++++++++++++++++++++++++++++++++++++
function Point(dimension){
	this.dimension = dimension;
}

//定义一个Point2D类型,"继承"Point类型
function Point2D(x, y){
	this.x = x;
	this.y = y;
}

Point2D.prototype.distance = function(){
	return Math.sqrt(this.x * this.x + this.y * this.y);
}

Point2D.prototype = new Point(2);  //Point2D继承了Point

//定义一个Point3D类型,也继承Point类型
function Point3D(x, y, z){
	this.x = x;
	this.y = y;
	this.z = z;
}

Point3D.prototype = new Point(3);  //Point3D也继承了Point

function test2(){
	//构造一个Point2D对象
	var p1 = new Point2D(0,0);
	//构造一个Point3D对象
	var p2 = new Point3D(0,1,2);
	println(p1.dimension);
	println(p2.dimension);
	println(p1 instanceof Point2D); //p1 是一个 Point2D
	println(p1 instanceof Point); //p1 也是一个 Point
	println(p2 instanceof Point); //p2 是一个Point	
}

//+++++++++++++++++++++++++++++++++++++++++
//3. 实例继承法
//+++++++++++++++++++++++++++++++++++++++++
function MyDate(){
	//instance是一个新创建的日期对象
    var instance = new Date(); 
	instance.printDate = function(){
		document.write("<p> "+instance.toLocaleString()+"</p> ");
	} 
	//对instance扩展printDate()方法
  	return instance;  //将instance作为构造函数的返回值返回
}

function test3(){
	var myDate = new MyDate();
	//这回成功输出了正确的时间字符串,看来myDate已经是一个Date的实例了,继承成功
	println(myDate.toGMTString()); 
	//如果没有return instance,将不能以下标访问,因为是私有对象的方法
	myDate.printDate(); 
}

//+++++++++++++++++++++++++++++++++++++++++
//4. 拷贝继承法
//+++++++++++++++++++++++++++++++++++++++++
Function.prototype.extends = function(obj){
	for(var each in obj)
 	{
		this.prototype[each] = obj[each]; 
  		//对对象的属性进行一对一的复制,但是它又慢又容易引起问题
		//所以这种"继承"方式一般不推荐使用
	}
}
var Point2D = function(){
	//……
};

Point2D.extends(new Point())
{
	//……
};

//+++++++++++++++++++++++++++++++++++++++++
//5. 混合继承法
//+++++++++++++++++++++++++++++++++++++++++
/*定义一个人类*/
function Person(name,age){
	this.name=name;
	this.age=age;
}
	
/*定义一个学生类*/
function Student(name,age,grade){
	//Person.apply(this,arguments);
	Person.call(this,name,age);
	this.grade=grade;
}

function test4(){
	var student=new Student("lv",21,"Grade 1");
	alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);
}


function println(mes){
	if(window.console)
		console.log(mes);
	else
		alert(mes);
}

function main(){
	test1();
	test2();
	test3();
}

main();

</script>


转自:http://www.nowamagic.net/librarys/veda/detail/488

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值