什么是封装
封装就是把一个对象庇护起来,使其只提供定义的接口要领,而庇护私有的变量。打个比如,游戏中的一个人物对象,它的履历只要经由过程打死怪兽这个接口要领来增添。假如能够直接修正履历就会直接影响到全部游戏的设定。所以这个时刻履历这个属性就是一个须要庇护的变量。
封装之利
封装庇护了私有属性,不必忧郁这些属性会被接口之外的要领之外的修正。更好的解耦。完成迪米特轨则(起码晓得准绳)(Demeter Principle)
封装之弊
私有要领没法做单元测试,只能对共有要领做单元测试,单元测试用例的设想能够须要对共有要领的掩盖增添保证掩盖越多的私有要领。灵活性下降。对须要封装的对象做很好的明白才完成他人挪用时刻须要的接口能够被猎取。
闭包完成封装类
var Person = (function () {
// 静态变量
var PersonCount = 0;
// 静态要领
function checkage(age) {
var r = /^\+?[1-9][0-9]*$/; //正整数
return r.test(age);
}
return function (name, age) {
// 私有属性.
var name, age;
this.getName = function () {
return name;
}
this.getAge = function () {
return age;
}
this.setName = function (name) {
name = name || 'No Name';
};
this.setAge = function (age) {
if (!checkage(age)) throw new Error('岁数不是一个正整数');
age = age;
}
PersonCount++;
if (PersonCount > 50) throw new Error('一个只能建立50个人');
this.setName(name);
this.setAge(age);
}
})();
//测试静态变量
/*
var Persons = [];
for (var i = 0; i < 51; i++) {
Persons[i] = new Person(i, i + 1);
console.log('name:' + Persons[i].getName() + 'age:' + Persons[i].getName());
}
//*/
//测试封装结果
/*
var Test = new Person("111", "1");
console.log(Test.name);
//*/
//测试静态函数checkage
//var TestAge =new Person("111","asd");
重要参考《javascript设想形式》的例子
总结
能够看到如许完成了封装结果。不过关于私有函数的测试。只能经由过程测试接口的用例席卷才完成。关于测试的请求能够就变高了。