20170607-私有变量

私有变量

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

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
    原文地址: https://segmentfault.com/a/1190000009692735
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞