资讯专栏INFORMATION COLUMN

20170607-私有变量

trilever / 797人阅读

摘要:私有变量任何在函数中定义的变量,都可以认为是私有变量,因为在不能再函数的外部访问这些变量。我们把有权访问私有变量和私有函数的公有方法称为特权方法。模块模式模块模式是为单例创建私有变量和特权方法。

私有变量

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83382.html

相关文章

  • 20170607-面向对象03-判断对象类型的方法

    摘要:这种方法也存在这样的问题如果修改了构造函数的原型对象,之前创建的对象无法通过这种方式来确定类型修改构造函数的原型对象会导致之前创建的对象无法通过这种方式判断类型判断对象继承自哪些父类型使用使用 判断对象类型的方法 使用原型对象上的constructor属性来判断 每个对象的原型上都有一个constructor属性,指向了其构造函数 注意:对象没有constructor属性(除非自己添加...

    zhoutao 评论0 收藏0
  • 20170607-面向对象02-继承

    摘要:继承原型链原型链是实现继承的主要方法。临时的构造函数将传入的对象作为这个构造函数的原型返回新实例以为原型创建一个新实例不仅属于所有,而且也会被共享。上诉例子只调用了一次构造函数,因此避免了在上面创建不必要的多余的属性。 继承 1 原型链 原型链是实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 构造函数、原型和实例的关系 每个构造函数都有一个原型对...

    lushan 评论0 收藏0
  • 20170607-面向对象01-创建对象

    摘要:原型对象的问题省略了为构造函数传递参数,导致了所有实例在默认情况下都取得相同的属性值。即使有其他代码会给这个对象添加方法或数据成员,但也不可能有别的方法访问传入到构造函数中的原始数据。 创建对象 1.Object构造函数 创建一个Object的实例,然为其添加属性和方法(早期创建对象的模式) var person = new Object(); person.name = Nichol...

    NusterCache 评论0 收藏0
  • mybatis 入门搭建

    摘要:首先导包依赖如下构建应用是以为中心的实例可以通过获得其中是工厂接口任务用于创建配置文件将会解析配置文件在类对象中配置获取数据源事务管理器映射器在文件下新建文件配置文件内容如下定义别名定义数据库信息事物管理 首先导包 依赖如下 mysql mysql-connector-java 8.0.15 org.m...

    enali 评论0 收藏0
  • web开发模式

    摘要:显示层控制层数据层统一交给或者处理处理流程客户端发送到执行读取返回返回给在返回给在给客户端问题代码杂乱即方式客户端发送到然后执行用于读取控制器获取到读取的数据以后再次返回给生成文件给客户端分为显示层控制层模型层属于提供的分布式组件服务分 Model1 显示层,控制层,数据层,统一交给jsp或者javabean处理. 处理流程 客户端发送request 到 jsp jsp 执行java...

    ztyzz 评论0 收藏0

发表评论

0条评论

trilever

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<