到目前为止,我们定义了并且初始化了公共变量_prop,并且为它提供了getter和setter方法。
需要定义一个静态变量?你可以把静态变量当作是为类所拥有的一个变量。因为在JavaScript中的类用函数对象来描述,所以我们只需要把一个新属性添加到该函数上:
Calculator.iCount=0;
现在,既然这个iCount变量是一个Calculator对象的属性,那么它将会被类Calculator的所有实例所共享。
function Calculator() {Calculator.iCount++;};
上面的代码计算类Calculator的所有实例的个数。
封装
通过使用如上面所定义的"Calculator",我们可以存取所有的"class"数据;然而,这增加了派生类中命名冲突的危险性。我们明显地需要封装以把对象看作自包含的实体。
数据封装的一种标准语言机制是使用私有变量。并且一个常用的仿效一个私有变量的JavaScript技术是在构造器中定义一个局部变量;这样以来,该局部变量的存取只能经由getter和setter来实现-它们是该构造器中的内部函数。在下列实例中,_prop变量在Calculator函数中定义并且在函数范围外不可见。其中有两个匿名的内部函数(分别被赋予setProp和getProp属性)让我们存取"私有"变量。另外,请注意,这里this的使用-十分相似于在Java中的用法:
function Calculator() {
var _prop = 0;
this.setProp = function (p){_prop = p};
this.getProp = function() {return _prop};
};
常常被忽视的是在JavaScript中作如此封装所付出的代价。须知,这种代价可能是巨大的,因为内部函数对象对于该"class"的每一个实例被不断地重复创建。
因此,既然基于原型构建对象速度更快并且消费更少些的内存,那么我们在最强调性能的场所特别支持使用公共的变量。请注意,你可以使用命名惯例来避免名称冲突-例如,在公共的变量的前面加上该类名。继承乍看之下,JavaScript缺乏对类层次的支持,这很相似于面向对象语言的程序员对于现代语言的期盼。然而,尽管JavaScript句法没有象Java一样支持类继承,但是我们仍然能够在JavaScript中实现继承-通过把已定义类的一个实例拷贝到其派生类的原型当中。
文章来源于领测软件测试网 https://www.ltesting.net/