1

私有变量

任何在函数中定义的变量,都可以认为是私有变量,因为在不能再函数的外部访问这些变量。私有变量包括函数的参数、函数中定义的变量和函数。我们把有权访问私有变量和私有函数的公有方法称为特权方法。

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
}()

jhhfft
590 声望40 粉丝

Write the Code. Change the World.