既然说到javascript的面向对象编程,那么我们也该说一下javascript中封装的实现。
javascript中封装的实现也有以下几种实现方式:
(1)门户大开类型
(2)用命名规范区别私有和共有的方式
(3)闭包
下面,我们就一一展开介绍:
(1)门户大开类型
/**
* 信息的隐藏是最终的目的,封装只不过是隐藏的一种方法
*/
(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.age)
// 解决上述问题
Person.prototype = {
checkAge : function(age) {
if (age > 0 && age < 150) {
return true;
} else {
return false;
}
}
}
Person.prototype["getName"] = function() {
return this.name || "Hello.js";
}
// var p = new Person(-10,"JIM");
var p = new Person(27, "JIM");
var p2 = new Person(27);
alert(p2.getName());
})()
这段代码是我从网上copy的,我个人并不是很觉得这可以作为一种封装的方式,
第一点:我觉得有些拼凑的嫌疑,而且没有什么规范性可言
第二点:不是很常用,大家看看知道就行了,完全没有必要记住
(2)用命名规范来区别私有和共有变量
(function(){
//用命名规范来区别私有和共有变量
function Person(name,age,email){
//定义私有变量
this._name;//私有
this._age;//私有
this.setName(name);
this.setAge(age);
this.email = 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,"JIM@165.COM");
})()
这种方法较上一种方法还算是有些规范了,但是依然不是我们常用的
按照我们java中封装的用法,哈哈,说句扯淡的,越是复杂的,才更常用些,当然,这只是句玩笑
(3)闭包实现封装
/**
* 闭包实现封装
*/
(function(){
function person(name,age,email,sex){
this.email = email;//public 变量
//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
}
this.init = function(){
this.setName(name);
this.setAge(age);
}
this.init();
}
//ceshi
var p = new person("JIM",-1,"JIM@126.COM")
})()
相对来说,第三种方法更加的常见,同时也是规范性最强的一个。