javascript_静态私有变量,模块模式,增强模块模式

 

静态私有变量
 (function() {
var name = ""; //私有变量,只在私有作用域中可以访问到
Person = function(value) { name = value; alert("私有作用域中的全局变量中的this:" + this); };
//Person为全局变量的构造函数 ,这时this为局部变量,所以name=value不能写成this.name=value;
Person.prototype.getName = function() { return name; };
Person.prototype.setName = function(value) { name = value; };
})();

var person = new Person("xj");
alert(person.getName());
person.setName("22");
alert(person.getName());
var person1 = new Person("nn");
alert(person1.getName()); //nn
alert(person.getName()); //也是nn

/*
变量name这里是一个静态的,由所有实例共享的属性。
也就是说,在一个实例上调用setName()会影响所有实例。
而调用setName()或新建一个Person实例,都会赋予name属性一个新值。、
结果就是所有实例都会返回相同的值
*/

 

模块模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype.sayName = function() { alert(this.name) };
//用模块模式实现 单例的特权方法
/*singletonPepoleManager这个匿名函数内部,首先定义了私有变量和函数。然后将一个对象字面量座位函数的值返回。
返回的对象字面量中只包含可以公开的属性和方法(这里是getPepoleCount和setPepole方法),
由于这个对象字面量是在匿名函数内部定义的,因此它的共有方法有权访问私有变量(pepole,person)和函数
*/

//singleton被定义之后立即调用执行
var singletonPepoleManager = function() {
var pepole = new Array();
var person = new Person("xj", 22, "soft");
pepole.push(person);
Person.prototype.sayAge = function() { alert(this.age) };
//这里返回的两个方法,都是有权访问pepole数组的特权方法。
//ps.特权方法:有权访问私有变量和私有函数的共有方法称为特权方法(闭包通过自己的作用域链可以访问这些变量,所以用闭包创建特权方法)
return {
getPepoleCount: function() { return pepole.length },
setPepole: function(person) {
if (typeof person == "object") { pepole.push(person); }
}
};
} ();

var person1 = new Person("nn", 33, "ware");
person1.sayName();
person1.sayAge();
singletonPepoleManager.setPepole(person1);
alert(singletonPepoleManager.getPepoleCount());

/*
总结:如果必须创建一个对象,并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式
*/
增强模块模式
//增加模块模式
/*适合那些 单例必须是某种类型的实例,同时还必须添加某些属性和方法*/


//singleton被定义之后立即调用执行
var singletonPepoleManagerExt = function() {
var pepole = new Array();
var person = new Person("xj", 22, "soft");
pepole.push(person);
Person.prototype.sayAge = function() { alert(this.age) };

/* ***未成功*/
var app = new Person();
app.getPepoleCount = function() { return pepole.length };
app.setPeople = function(person) { if (typeof person == "object") { pepole.push(person); } };
return app;

// return {
// getPepoleCount: function() { return pepole.length },
// setPepole: function(person) {
// if (typeof person == "object") { pepole.push(person); }
// }
// };

} ();

var person2 = new Person("xj22", 22, "ware");
singletonPepoleManagerExt.setPepole(person2);
alert(singletonPepoleManagerExt.getPepoleCount());



posted @ 2012-03-23 13:21  cqclassic  阅读(329)  评论(0编辑  收藏  举报