对象是人们要进行研究的任何倳物,从最简单的整数到复杂的飞机等均可看作对象它不仅能表示具体的事物,还能表示抽象的规则、计划或事件--引自百度百科
面向對象编程,是当前最流行的编程模式但令人沮丧的是,作为前端应用最为广泛的javascript并不支持面向对象。
javascript没有访问控制符它没有定义类嘚关键字class,它没有支持继承的extend或冒号它也没有用 来支持虚函数的virtual,不过Javascript是一门灵活的语言,下面我们就看看没有关键字class的Javascript如何实现类萣 义并创建对象。
定义类并创建类的实例对象
你或许会说疑?这个不是定义函数吗没错,这个是定义函数我们定义了一个Shape函数,並对x和y进行了初始化不过,如果你换个角度来 看这个就是定义一个Shape类,里面有两个属性x和y初始值分别是1和2,只不过我们定义类的關键字是function而不是class。
然后我们可以创建Shape类的对象aShape,如下:
定义公有属性和私有属性
我们已经创建了aShape对象但是,当我们试着访问它的属性時会出错,如下:
这说明用var定义的属性是私有的。我们需要使用this关键字来定义公有的属性
这样,我们就可以访问Shape的属性了如:
好,我们可以根据上面的代码总结得到:用var可以定义类的private属性而用this能定义类的public属性。
定义公有方法和私有方法
在Javascript中函数是Function类的实例,Function间接继承自Object所以,函数也是一个对象因此,我们可 以用赋值的方法创建函数当然,我们也可以将一个函数赋给类的一个属性变量那麼,这个属性变量就可以称为方法因为它是一个可以执行的函数。代码如下:
我们在上面的代码中定义了一个draw并把一个function赋给它,下面我们就可以通过aShape调用这个函数,OOP中称为公有方法如:
如果用var定义,那么这个draw就变成私有的了OOP中称为私有方法,如:
这样就不能使用aShape.draw調用这个函数了
Javascript并不支持OOP,当然也就没有构造函数了不过,我们可以自己模拟一个构造函数让对象被创建时自动调用,代码如下:
茬Shape的最后我们人为的调用了init函数,那么在创建了一个Shape对象是,init总会被自动调用可以模拟我们的构造函数了。
如何让构造函数带参数呢其实很简单,将要传入的参数写入函数的参数列表中即可如:
这样,我们就可以这样创建对象:
在Javascript中如何定义静态的属性和方法呢如下所示:
有了静态属性和方法,我们就可以用类名来访问它了如下:
注意:静态属性和方法都是公有的,目前为止我不知道如何讓静态属性和方法变成私有的~
在方法中访问本类的公有属性和私有属性
在类的方法中访问自己的属性,Javascript对于公有属性和私有属性的访问方法有所不同请大家看下面的代码:
根据笔者的经验,类中的this并不是一直指向我们的这个对象本身的主要原因还是因为Javascript并不是OOP语言,洏且函数和类均用function定义,当然会引起一些小问题
this指针指错的场合一般在事件处理上面,我们想让某个对象的成员函数来响应某个事件当事件被触发以后,系统会调用我们这个成员函数但是,传入的this指针已经不是我们本身的对象了当然,这时再在成员函数中调用this当嘫会出错了
解决方法是我们在定义类的一开始就将this保存到一个私有的属性中,以后我们可以用这个属性代替this。我用这个方法使用this指针楿当安全而且很是省心~
我们修改一下代码,解决this问题对照第六部分的代码看,你一定就明白了:
关于Javascript中的OOP实现就聊到这里以上是朂实用的内容,一般用Javascript定义类创建对象用以上的代码已经足够 了。当然你还可以用mootools或prototype来定义类,创建对象我用过mootools框架,感觉很不错它对Javascript的类 模拟就更完善了,还支持类的继承有兴趣的读者可以去尝试一下。当然如果使用了框架,那么在你的网页中就需要包含相關的js头文件因此我还是希望读者 能够在没有框架的情况下创建类,这样代码效率较高,而且你也可以看到要创建一个简单的类并不麻烦~
在下一个版本的Javascript中,将会加入对OOP的支持届时,我们将看到class关键字public、private访问控制 符~extend继承。如果大家对下一代Javascript感兴趣不妨可以先接触一下ActionScript3.0,这是一门相当先进的脚本语言 绝对好,特别是面向对象这部分写的特别通俗易懂,例子生动读完以后感觉很有收获,在贊叹新版的ECMAScript的同时也给了我极大的动力继续深 入学习OOP编程思想