<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript高级语法6-封装</title>
</head>
<body>
<script>
/*
* 信息的隐藏是最终的目的,封装只不过是隐藏的一种方法
*/
function demo1(){
(function(){
/*类的定义形式:
* 1.门户大开类型
* 2.命名规范区别私有和公有方式
* 3.闭包
*/
//门户大开型
function Person(age,name){
this.name = name;
if(!this.checkAge(age)){
throw new Error("年龄必须在0-150之间")
}
this.age = age;
}
// var p = new Person(-10,"jim");
// alert(p.name+" "+p.age); //年龄-10,不符合常规
//解决上述问题
Person.prototype = {
checkAge:function(age){
if(age>=0 && age<150){
return true
}else{
return false;
}
}
};
Person.prototype["getName"] = function(){
return this.name || "javascript.com"
}
// var p = new Person(-10,"jim");
// alert(p.name+" "+p.age);
//读取规则的验证
var p2 = new Person(27);
alert(p2.getName()+" "+p2.age);
})()
}
//用命名规范来区别私有和公有变量
function demo2(){
(function(){
function Person(name,age,email){
//定义私有变量
this._name;
this._age;
this.setName(name);
this.setAge(age);
this.emial = email;
}
Person.prototype = {
setName:function(name){
this._name = name;
},
setAge:function(age){
if(age>=0 && age<150){
this._age = age;
}else{
throw new Error("年龄必须在0-150之间")
}
}
};
var p = new Person("jim",1,"张丹");
})();
}
//闭包实现封装
function demo3(){
(function(){
function Person(name,age,email,sex){
this.email = email;
//get
this.getName = function(){
return this.name;
}
this.getAge = function(){
return this.age;
}
//set
this.setName = function(name){
this.name = name;
}
this.setAge = function(age){
if(age>=0 && age<150){
this.age = age;
}else{
throw new Error("年龄必须在0-150之间")
}
};
var _sex="M"; //这也是私有变量的编写方式
this.getSex = function(){
return _sex;
}
this.setSex = function(sex){
_sex = sex;
}
this.init = function(){
this.setName(name);
this.setAge(age);
}
this.init();
}
var p = new Person("jim",-1,"xxxx@qq.com")
})();
}
//静态化
(function(){
/*
* 普通的属性和函数是作用在对象上的
* 静态函数是定义到类上的
*/
function Person(name,age){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
//第一种静态函数的写法
Person.add = function(x,y){
return x+y
}
//alert(Person.add(1,3))
//第二种方式:用类中类的方式完成每一个对象全拥有相同的属性和函数
var cat = (function(){
//私有静态属性
var AGE = 10;
//私有函数
function add(x,y){
return x+y
}
return function(){
this.AGE = AGE;
this.add = function(x,y){
return add(x,y);
}
this.setAge = function(age){
AGE = age;//这个可以设置成功,但只对以后创建实例的初始化有效。
}
}
})()
alert(new cat().add(1,2)+" "+new cat().AGE);
new cat().setAge(20); //这个可以设置成功,但只对以后创建实例的初始化有效。
alert(new cat().AGE);
})();
/*
* 1.保护内部数据的完整性是封装一大用处
* 2.对象的重构变得很轻松,(可以动态化变更部分代码)
* 3.弱化模块之间的耦合。
* 弊端:私有的方法会变得很难进行单元测试,使用封装就意味着与复杂的代码打交道。
* 最大的问题:封装在javascript是很难实现的。
*/
</script>
</body>
</html>