首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JavaScript 面向对象程序设计(下)——封装[转]

2012-11-22 
JavaScript 面向对象程序设计(上)——封装[转]转于:CoolCode.CNJavaScript 是一种非常灵活的面向对象程序设

JavaScript 面向对象程序设计(上)——封装[转]

转于:CoolCode.CN

JavaScript 是一种非常灵活的面向对象程序设计语言,它与传统的强类型的面向对象程序设计语言(如 C++,Java,C#等)有很大不同,所以要实现如 C++、java、C# 当中的一些特性就需要换一种思考方式来解决。今天主要讨论如何在 JavaScript脚本中实现数据的封装(encapsulation)。

数据封装说的简单点就是把不希望调用者看见的内容隐藏起来。它是面向对象程序设计的三要素之首,其它两个是继承和多态,关于它们的内容在后面再讨论。

关于数据封装的实现,在 C++、Java、C# 等语言中是通过 public、private、static 等关键字实现的。在JavaScript 则采用了另外一种截然不同的形式。在讨论如何具体实现某种方式的数据封装前,我们先说几个简单的,大家所熟知却又容易忽略的JavaScript 的概念。

1 几个基本概念1.1 变量定义

在 JavaScript 语言中,是通过 var 关键字来定义变量的。

但是如果我们直接给一个没有使用 var 定义的变量赋值,那么这个变量就会成为全局变量。

一般情况下,我们应该避免使用没有用 var 定义的变量,主要原因是它会影响程序的执行效率,因为存取全局变量速度比局部变量要慢得多。

但是这种用法可以保证我们的变量一定是全局变量。

另外,为了保证速度,我们在使用全局变量时,可以通过 var 定义一个局部变量,然后将全局变量赋予之,由此可以得到一个全局变量的局部引用。

1.2 变量类型

没有定义的变量,类型为 undefined。

变量的值可以是函数。

函数在 JavaScript 中可以充当类的角色。

1.3 变量作用域

变量作用域是指变量生存周期的有效范围。

单纯用 { } 创建的块不能创建作用域。

with 将它包含的对象作用域添加到当前作用域链中,但 with 不创建新的作用域。with 块结束后,会将对象作用域从当前作用域链中删除。

try-catch 中,catch 的错误对象只在 catch 块中有效,但 catch 块中定义的变量属于当前作用域。

其它如 if、for、for-in、while、do-while、switch 等控制语句创建的块不能创建作用域。

用 function 创建的函数,会创建一个新的作用域添加到当前作用域中。

?

2 封装

下面我们就来讨论具体的封装。首先说一下大家最熟悉的几种封装:私有实例成员、公有实例成员和公有静态成员。最后会讨论一下大家所不熟悉的私有静态成员和静态类的封装办法。因为下面要讨论的是面向对象编程,所有当函数作为类来定义和使用时,我们暂且将其成为类。

2.1 私有实例成员

私有实例成员在 JavaScript 中实际上可以用函数内的局部变量来实现,它相当于类的私有实例成员。例如:

  • class7 = new function() { // private static fields vars_first = 1; vars_second = 2; // private static method functionmethod1() { alert(s_first); } // public static method this.method1 = function(){ method1(); alert(s_second); }}class7.method1();

    大家会发现,class7 其实就是个对象,只不过这个对象所属的是匿名类,该类在创建完 class7 这个对象后,就不能再被使用了。而 class7 不是一个 function,所以不能够作为一个类被实例化,因此,这里它就相当于一个静态类了。

  • 热点排行