您的位置:首页 > Web前端 > JavaScript

JavaScript 继承的方法总结

2012-10-16 14:04 441 查看
<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>


转自:/article/1307138.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: