JavaScript面向对象程序设计中对象的定义和继承详解
本文实例讲述了JavaScript面向对象程序设计中对象的定义和继承。分享给大家供大家参考,具体如下:
在面向对象的Javascript编程中,希望代码优雅有高效是非常重要的。javascript中不存在类的概念,只有对象。要想把Javascript代码写的像java或者C++一样优雅,就得考虑如何去实现,同时也要考虑性能和高效。定义javascript对象的方式有很多,继承的方式也很多。通过不断地实践,推荐如下的方法:
1.Javascript对象的定义采用混合方式【构造函数+原型方式(prototype)】
(1)通过构造函数方式定义对象的所有非函数属性
(2)用原型方式定义对象的函数属性
采用这种方式,所有的属性都是单一对象私有的,而方法则是所有对象公有的,对象之间的属性不相互干扰,各个对象间共享同一个方法。
//使用原型+构造函数方式来定义对象
//构造函数定义对象的非函数属性
functionPerson()
{
this.username=newArray();
this.password="123";
}
//通过原型方式定义对象的函数
Person.prototype.getInfo=function()
{
alert(this.username+","+this.password);
};
varp=newPerson();
varp2=newPerson();
p.username.push("zhangsan");
p2.username.push("lisi");
p.getInfo();
p2.getInfo();
在现实的开发过程中,我们可能希望开发的各个类(实质是对象)能像java程序中放到一个包中统一管理,统一使用,而各个对象相互独立,同时避免对象重名等等因素,我们需要给每个类有个作用域,此时我们采用将对象放到自定匿名函数的方式来解决,这一点和jQuery开发插件的有点类似。代码如下:
/**
*@authorjasson
*@includecommon.js
*/
//对象存在就等于对象,对象不存在就创建{}
varJassonChart=JassonChart||{};
(function(){
//构造函数定义对象的非函数属性
functionPerson()
{
this.username=newArray();
this.password="123";
}
//通过原型方式定义对象的函数
Person.prototype.getInfo=function()
{
alert(this.username+","+this.password);
};
//将该类放到JassonChart中,类似java中的包,或者C++中的
JassonChart.Person=Person;
}());
//调用该类库中的Person类
varp=newJassonChart.Person();
这样我们可以定义多个类,每个类都采用如上的方式实现,这样各个类相互都有作用域,非常规范。对于我们要用到的一些工具类,我们可以采用简单的对象进行定义,代码如下
/**
*@authorjasson
*/
varJassonChart=JassonChart||{};
JassonChart.util={
constants:{
WIDTH:'width',
HEIGHT:'height',
SVG:'SVG',
CANVAS:'CANVAS',
G:'G',//svgelement
STRING:'string'
},
distance:function(a,b){
vardx=a.x-b.x;
vardy=a.y-b.y;
returnMath.sqrt(dx*dx+dy*dy);
}
};
2.Javascript对象的继承采用如下几种方式
2.1Javascript对象的继承采用混合方式【构造函数+原型方式(prototype)】
在JavaScript中最好的方式就是用混合方式实现对象间的继承。和定义对象一样,我们可以将属性和方法用不同的方式定义,用call或apply方式定义继承对象的属性,利用原型链的方式实现方法的继承。如下代码所示:
//使用混合的方式实现对象的继承
functionParent(hello)
{
this.hello=hello;//定义父类的属性
}
Parent.prototype.sayHello=function()//定义父类的方法
{
alert(this.hello);
}
functionChild(hello,world)
{
Parent.call(this,hello);//继承父类的属性
//orParent.apply(this,arguments);//继承父类的属性
this.world=world;
}
Child.prototype=newParent();//继承父类的方法
Child.prototype.sayWorld=function()
{
alert(this.world);
}
varchild=newChild("hello","world");
child.sayHello();
child.sayWorld();
2.2深度拷贝方法
所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。
functiondeepCopy(p,c){
varc=c||{};
for(variinp){
if(typeofp[i]==='object'){
c[i]=(p[i].constructor===Array)?[]:{};
deepCopy(p[i],c[i]);
}else{
c[i]=p[i];
}
}
returnc;
}
使用的时候这样写:
varDoctor=deepCopy(Chinese);
现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:
Chinese.birthPlaces=['北京','上海','香港'];
Doctor.birthPlaces.push('厦门');
这时,父对象就不会受到影响了。
alert(Doctor.birthPlaces);//北京,上海,香港,厦门 alert(Chinese.birthPlaces);//北京,上海,香港
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。