经过在私有做用域中定义私有变量和函数,一样也能够建立特权方法,其基本模式以下所示。javascript
(function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
// 构造函数
MyObject = function (){
};
// 公有/特权方法
MyObject.prototype.publicMethod = function(){
privateVariable++;
return privateFunction();
};
})();
这个模式建立了一个私有做用域,并在其中封装了一个构造函数及相应的方法。在私有做用域中,首先定义了私有变量和私有函数,而后又定义了构造函数及其公有方法。公有方法是在原型上定义的,这一点体现了典型的原型模式。须要注意的是,这个模式在定义构造函数时并无使用函数声明,而是使用了函数表达式。函数声明只能建立局部函数,但那并非咱们想要的。出于一样的缘由,咱们也没有在声明MyObject时使用var关键字。记住:初始化未经声明的变量,老是会建立一个全局变量。所以,MyObject就成了一个全局变量,可以在私有做用域以外被访问到。但也要知道,在严格模式下给未经声明的变量赋值会致使错误。java
这个模式与在构造函数中定义特权方法的主要区别,就在于私有变量和函数是由实例共享的。因为特权方法是在原型上定义的,所以全部实例都使用同一个函数,而这个特权方法,做为闭包,老是保存着对包含做用域的引用。来看一看下面的代码。闭包
(function(){
var name = "";
Person = function(value){
name=value;
};
Person.prototype.getName = function(){
return name;
};
Person.prototype.setName = function(value){
name = value;
};
})();
var person1 = new Person("Nicholas");
alert(person1.getName()); // "Nicholas"
person1.setName("Greg");
alert(person1.getName()); // "Greg"
var person2 = new Person("Michael");
alert(person1.getName()); // "Michael"
alert(person2.getName()); // "Michael"
这个例子中的Person构造函数与getName()和setName()方法同样,都有权访问私有变量name。在这种模式下,变量name就变成了一个静态的、由全部实例共享的属性。也就是说,在一个实力上调用setName()会影响全部实例。而调用setName()或新建一个Person实例都会赋予name属性一个新值。结果就是全部实例都会返回相同的值。函数
以这种方式建立静态私有变量会由于使用原型而增进代码复用,但每一个实例都没有本身的私有变量。究竟是使用实例变量,仍是静态私有变量,最红仍是要视你的具体需求而定。spa