JavaScript 面向对象程序设计(3)——封装

本文介绍了一种在JavaScript中创建具有私有静态成员的类的方法。通过使用静态封装环境和特定的命名约定来区分私有静态成员和实例成员。此外,还探讨了不同类型的类方法如何访问这些成员。

来创建了一个静态封装环境,实际的类是在这个环境中定义的,并且在最后通过 return 语句将最后的类返回给我们的全局变量 class5,然后我们就可以通过 class5 来引用这个带有静态私有成员的类了。

为了区分私有静态成员和私有实例成员,我们在私有静态成员前面用了 s_ 前缀,在私有实例成员前面加了 m_ 前缀,这样避免了重名,因此在对象中总是可以存取私有静态成员的。

但是这种命名方式不是必须的,只是推荐的,私有静态成员可以跟私有实例成员同名,在重名的情况下,在类构造器和在类中定义的实例方法中存取的都是私有实例成员,在静态方法(不论是公有静态方法还是私有静态方法)中存取的都是私有静态成员。

在类外并且在静态封装环境中通过 prototype 方式定义的公有实例方法存取的是私有静态成员。

在静态封装环境外定义的公有静态方法和通过 prototype 方式定义的公有实例方法无法直接存取私有静态成员。

另外一种方式通过直接实例化匿名函数方式来创建带有私有静态成员的类的例子跟上面的例子很相似:

  1. new function() {
  2.     // private static fields
  3.     var s_first = 1;
  4.     var s_second = 2;
  5.     // private static methods
  6.     function s_method1() {
  7.         s_first++;
  8.     }
  9.     var s_second = 2;
  10.     class6 = function() {
  11.         // private fields
  12.         var m_first = 1;
  13.         var m_second = 2;
  14.         // private methods
  15.         function method1() {
  16.             alert(m_first);
  17.         }
  18.         var method2 = function() {
  19.             alert(m_second);
  20.         }
  21.         // public fields
  22.         this.first = "first";
  23.         this.second = ['s','e','c','o','n','d'];
  24.         // public methods
  25.         this.method1 = function() {
  26.             s_second--;
  27.         }
  28.         this.method2 = function() {
  29.             alert(this.second);
  30.         }
  31.         // constructor
  32.         {
  33.             s_method1();
  34.             this.method1();
  35.         }
  36.     }
  37.     // public static methods
  38.     class6.method1 = function() {
  39.         s_first++;
  40.         alert(s_first);
  41.     }
  42.     class6.method2 = function() {
  43.         alert(s_second);
  44.     }
  45. };
  46. var o1 = new class6();
  47. class6.method1();
  48. class6.method2();
  49. o1.method2();
  50. var o2 = new class6();
  51. class6.method1();
  52. class6.method2();
  53. o2.method2();

这个例子的结果跟通过第一种方式创建的例子是相同的。只不过它的静态封装环境是这样的:

  1. new function() {
  2.     ...
  3. };

在这里,该函数没有返回值,并且对于 class5 的定义是直接在静态封装环境内部通过给一个没有用 var 定义的变量赋值的方式实现的。

当然,也完全可以在

  1. (function() {
  2.     ...
  3. })();

这种方式中,不给该函数定义返回值,而直接在静态封装环境内部通过给一个没有用 var 定义的变量赋值的方式来实现带有私有静态成员的类的定义。

这两种方式在这里是等价的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值