代码改变世界

javascript学习(8)——[知识储备]封装

2013-11-17 20:30  低调de草原狼  阅读(149)  评论(0编辑  收藏  举报

既然说到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")
})()

相对来说,第三种方法更加的常见,同时也是规范性最强的一个。