私有变量
任何在函数中定义的变量,都可以认为是私有变量,因为在不能再函数的外部访问这些变量。私有变量包括函数的参数、函数中定义的变量和函数。我们把有权访问私有变量和私有函数的公有方法称为特权方法。
function MyObject(number){
// 私有变量和私有函数,number也是私有变量
var privateVariable = 10
function privateFunction(){
return false
}
// 特权方法
this.publicMethod = function(){
number++
privateVariable++
return privateFunction()
}
}
var myobject = new MyObject()
在创建MyObject的实例后,除了使用publicMethod这一个途径外,没有任何办法可以直接访问privateVariable和privateFunction以及number,利用私有和特权成员,可以隐藏哪些不应该被直接修改的数据。
静态私有变量
(function(){
var name = ""
var privateVariable = 10
function privateFunction(){
return false
}
// 没有在声明Person时使用var关键字,则会创建一个全局变量
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"
这个模式与在构造函数中定义特权方法的主要区别,就在于私有变量和私有函数是由所有实例共享的。由于特权方法是在原型上定义的,因此所有实例都使用同一个特权方法。而这个特权方法,作为一个闭包,总是保存着对包含作用域的引用。
模块模式
模块模式(module pattern)是为单例创建私有变量和特权方法。所谓单例,指的就是只有一个实例的对象。按照惯例,使用对象字面量的方式来创建单例对象.
var module = function(){
var privateVariable = 10
function privateFunction(){
return false
}
return {
publicProperty: true,
publicMethod: function(){
privateVariable++
return privateFunction()
}
}
}
如果必须创建一个对象并以某些数据进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以使用模块模式。
var application = function(){
var components = new Array()
components.push(new BaseComponent())
return {
getComponentCount: function(){
return components.length
},
registerComponent: function(component){
if(typeof component === "object"){
components.push(component)
}
}
}
}()
增强的模块模式
增强的模块模式适合那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其加以增强的情况.
var application = function(){
var components = new Array()
components.push(new BaseComponent())
// 单例必须是某种类型的实例
var app = new ComponentList()
app.getComponentCount = function(){
return components.length
}
app.registerComponent = function(component){
if(typeof component === "object"){
components.push(component)
}
}
return app
}()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。