一,首先,为什么要使用封装?
这是从信息的角度出发的,信息的隐藏是最终的目的,而封装只不过是实现隐藏的一种方法。
这里我们需要明白一点就是:类的定义有如下的三种方式:
(第一种)门户大开型方式 (第二种)用命令规范区别私有和公有的方式 (第三种)闭包
现在详细描述一下每一种类的定义方式:
针对第一种,门户大开类型
首先,我们来看一种情况
(1)声明一个简单的类,代码如下
1
2
3
4
5
|
function
Person(age,name) { this .name=name; this .age=age; } |
(2)实例化类+调用
1
2
|
var p= new Person(-10, "小明" ); alert(p.age) //结果出现年龄出现负数 |
从上述的运行结果中,我们可以看出程序可以正常执行,但这并符合实际,因为年龄出现 了负数,这不是我们想要的,我们需要一个能正确处理并产生与实际情况相符的解决方案。
为了能解决上述年龄出现的问题,我们可以这样做:扩展类的原型链
Person.prototype={ checkAge:function (age) { if(0<age&&age<150){ return true; }else { return false; } } }
加上解决方案后,代码如下
(1)基本类
function Person(age,name) { this.name=name; //调用方法判断验证 if(!this.checkAge(age)){ throw new Error("年龄必须在0-150之间"); } this.age=age; }
(2)年龄判断验证
Person.prototype={ checkAge:function (age) { if(0<age&&age<150){ return true; }else { return false; } } }
(3)调用
var p2=new Person(10,"小明"); alert(p2.age)
我们还可以给name添加一个读取验证,name为空时使用默认值 同样是扩展类的原型链
代码如下,
Person.prototype["getName"]=function () { return this.name||"我是默认的"; } //调用
var p3=new Person(10,""); alert(p3.getName())//结果为“我是默认的”
总结一下:当类被定义为门户大开类型时会出现与实际不符合的情况 ,虽然我们可以加在类上扩展原型类加验证方法解决,但是这样会使类变得臃肿。
针对第二种,用命名规范区别私有和公有
步骤如下,
(1)定义类 在类中定义变量(私有和公有变量)+验证方法的调用
//用命名规范来区别私有和公有 function Person(name,age,email) { //定义私有变量