如果你使用javascript编程,你或许会怀疑它是否包含了面向对象(oo)的结构。实际上,javascript的确支持面向对象的架构――在某种程度上。本文将通过一个可扩展向量图形(svg)的实例来说明javascript的oo结构。
我如何在类中定义方法和属性?
|
oo开发的一个基本方面是类及其相应的方法和/或属性的使用。javascript通过function关键字支持类(及其属性)的使用。下面的代码定义了一个叫做figure的javascript类:
function figure() {
this.centerx=0;
this.centery=0;
this.area=0;
this.transform = transform; // methods are defined like this
function transform(movex,movey,angle) {
this.centerx += movex;
this.centery += movey;
} }
这个figure类有三个属性:centerx,centery,和area。另外,它还有一个方法叫做transform()。前三行是这个类的构造器。
但是它看起来不像一个类
你会想figure()看起来不像一个类,而更像一个javascript的函数。那么为什么figure()定义的是个类?
严格的说,figure()函数没有定义一个类,但是它仿造了一个。它实际上创建了一个对象,在括号里的代码使这个对象的构造器。javascript的对象支持是很基础的,它并不区分类和对象。
这就引到了问题为什么figure()函数创建的是一个对象。对象是可以有属性和方法的。基本上,因为figure()函数同时包含了属性和方法,它就是个对象。在javascript里,所有的函数即是对象又是可调用的代码块。这不像它听起来的那样容易被误解。要创建一个figure()类/对象,你只用使用以下句法:
myfigure = new figure();
你也可以把figure()函数当作代码块调用,就像这样:
figvalue = figure();
变量figvalue没有被定义是因为代码块figure()没有返回任何值。如果你把return(this.area)加到函数的最后一行,figvalue就会有个值0。所以figvalue是个类型数字,myfigure是对象 rectangle的实例。
为什么所有的变量前面都一个“this”?
这个关键字this表示这是对象的实例变量,可以使用myfigure.centerx从对象外部访问。要让变量成为私有变量,去掉前缀this就行了。this.transform = transform这一行让方法成为公用方法。这个方法通过myfigure.transform(100,100,0)调用。

