Ajax In Action 附录B 2.2

B 2.2 构造函数,类,原型

在面向对象编程时,我们一般都通过父类来创建它的子对象,JavaJavaScript都支持new关键字,允许我们创造一个预定义好的对象的实例,下面就来看一下它们之间的相似点。

Java中,所有东西(除了原始的东西)都是对象,都是从java.lang.Object类继承而来。Java虚拟机有一个内嵌的解析类,字段,和方法的机制,我们在Java中声明:

MyObject myObj=new MyObject(arg1,arg2);

我们首先定义了变量的类型,然后用相关的构造函数进行初始化,这个声明成功的必要条件是MyObject类已经被声明,并且有一个合适的构造函数。

JavaScript也有对象和类,但是没有内嵌的继承。实际上,每一个JavaScript对象都是同一个类的实例,这个类可以在运行的时候可以将成员变量和函数绑定到自身。所以我们就可以任意的给对象指定属性:

MyJavaScriptObject.completelyNewProperty="something";

这种对所有人开放的方式可以通过使用原型的方式变得让面向对象开发者觉得熟悉,这种圆形可以在使用一个特殊的函数进行初始化的时候将定义的属性和函数自动绑定到对象。不使用原型的话也可以写基于对象的JavaScript,但是原型提供了在进行复杂的富客户端编程时所需要的面向对象程序员的规则性以及熟悉性。

那么在JavaScript中我们也可以写一些类似于Java声明的东西:

var myObj=new MyObject();

但是我们并不需要定义一个MyObjec的类,而是定义个具有相同名字的函数。简单的构造函数如下:

function MyObject(name,size){

this.name=name;

this.size=size;

}

然后我们就可以象下面这样来引用它:

var myObj=new MyObject("tiddles","7.5 meters");

alert("size of "+myObj.name+" is "+myObj.size);

在构造函数里面任何设置成this的属性东西随后就可以作为这个对象的一个成员被引用,如果我们还想将alert()内部化,那么tiddles就可以告诉我们这是多么巨大了。一种习惯的做法是在构造函数内定义函数:

function MyObject(name,size){

this.name=name;

this.size=size;

this.tellSize=function(){

alert("size of "+this.name+" is "+this.size);

}

}

var myObj=new Object("tiddles","7.5 meters");

myObj.tellSize();

这样也可以,但是有两个不太理想的地方。首先,我们每创建一个MyObject的实例,我们就创建了一个方法。但是Ajax程序员,应该尽量减少内存的使用,如果我们打算创建很多个这样的对象,我们当然要尽量避免这种情况;其次,我们创建了一个closures在这里,但是一旦我们在构造函数里面使用DOM的结点,我们会遇到更多的问题。在这个附录里面,我们会更进一步的看一下closures。不过现在我们先来看一下原型prototype。原型是JavaScript对象的属性,在面向对象语言中没有与之相对应的东西。函数和属性可以通过构造函数的原型联系起来。原型和new关键字联合工作,当一个函数被new引用的时候,所有的原型的针对函数的属性和方法就会被绑定到新的对象。这听起来似乎有点奇怪,但实际用起来很简单:

function MyObject(name,size){

this.name=name;

this.size=size;

}

MyObject.prototype.tellSize=function(){

alert("size of "+this.name+" is "+this.size);

}

var myObj=new MyObject("tiddles","7.5 meters");

myObj.tellSize();

首先,我们像以前一样声名构造函数,然后给原型添加函数。当我们创建了这个对象的一个实例,这个函数就被附加上了。This关键字负责运行时候对象实例,这样就没有问题了。

注意这些事件的顺序,我们只有在构造函数声明之后才能引用原型,生成的对象只能从原型继承那些在构造函数被引用之前就有的东西,原型可以在构造函数的调用中修改,我们可以给原型添加很多东西,而不仅仅是一个函数。

MyObject.prototype.color="red";

var obj1=new MyObject();

MyObject.prototype.color="blue";

MyObject.prototype.soundEffect="boOOOoing!!";

var obj2=new MyObject();

obj1是红色的,没有声音功能,而obj2则是蓝色,并且有吵闹的声音效果,其实这种修改原型的方法是没有什么用处的。我们了解这些事情是怎么发生的是比较有用的,但使用原型来给JavaScript对象定义与类相似的行为是比较安全的途径。

有意思的是,一些内嵌类的原型可以被扩展,下面就让我们看看他们是如何工作的。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值