JavaScript的封装

来源:互联网 发布:求补码的方法编程 编辑:程序博客网 时间:2024/06/04 08:14

一,首先,为什么要使用封装?

这是从信息的角度出发的,信息的隐藏是最终的目的,而封装只不过是实现隐藏的一种方法。

这里我们需要明白一点就是:类的定义有如下的三种方式:

(第一种)门户大开型方式       (第二种)用命令规范区别私有和公有的方式    (第三种)闭包

现在详细描述一下每一种类的定义方式:

针对第一种,门户大开类型

首先,我们来看一种情况

(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) {        //定义私有变量
原创粉丝点击