私有变量
任安在函数中定义的变量,都可以认为是私有变量,因为在不能再函数的外部接见这些变量。私有变量包括函数的参数、函数中定义的变量和函数。我们把有权接见私有变量和私有函数的公有要领称为特权要领。
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
}()