函数中的私有变量和特权方法

定义

  【1】【私有变量】
  任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数外部访问这些变量。私有变量包括函数的参数、局部变量和在函数内部定义的其他函数

  【2】【特权方法】
  如果在函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。而利用这一点,就可以创建用于访问私有变量的公有方法。有权访问私有变量和私有函数的公有方法称为特权方法。

创建方式

  【1】【构造函数】

  在构造函数内部定义所有私有变量和函数。然后,创建能够访问这些私有成员的特权方法。能够在构造函数中定义特权方法,是因为特权方法作为闭包有权访问在构造函数中定义的所有变量和函数。
    [缺点]必须使用构造函数模式来达到目的,且针对每个实例都会创建同样一组方法

function MyObject(){
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        alert(1)
        return false;
    }
    //特权方法
    this.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    }
}
new MyObject().publicMethod();//弹出1    

  【2】【静态私有变量】

  通过在私有作用域中定义私有变量和方法来创建特权方法。
    [优点]私有变量和函数由实例共享,增强代码复用
    [缺点]每个实例都没有自己的私有变量

(function(){
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        alert(1)
        return false;
    }
    //在定义该构造函数时并没有使用函数声明,而是使用了函数表达式。且没有使用var关键字,使其成为全局变量。
    MyObject = function(){};
    //在原型上定义特权方法
    MyObject.prototype.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    }
})();
new MyObject().publicMethod();//弹出1    

    [另一个例子]

(function(){
    var name = "";
    Person = function(value){
        name = value;
    };
    Person.prototype.getName = function(){
        return name;
    };
    //name变成静态的由所有实例共享的属性
    Person.prototype.setName = function(value){
        name = value;
    }
})();

var person1 = new Person("Nicholas");
console.log(person1.getName());//"Nicholas"
person1.setName("Greg");
console.log(person1.getName());//"Greg"

var person2 = new Person("Michael");
console.log(person1.getName());//"Michael"
console.log(person2.getName());//"Michael"

作用

  【隐藏数据】:利用私有和特权成员,隐藏不应该被直接修改的数据

function Person(name){
    this.getName = function(){
        return name;
    }
    this.setName = function(value){
        name = value;
    };
}
var person = new Person("Nicholas");
console.log(person.getName());//"Nicholas"
person.setName(‘Greg‘);
console.log(person.getName());//"Greg"
/*以上代码的构造函数定义了两个特权方法:getnName()和setName()。这两个方法都可以在构造函数外部使用,而且有权访问私有变量name。但在Person构造函数外部,没有任何办法访问name。由于这两个方法都是在构造函数内部定义的,它们作为闭包能够通过作用域访问name。*/

单例

  【单例定义】单例是指只有一个实例的对象

  【单例创建方式】JavaScript是以对象字面量的方式来创建单例对象的

针对于单例的私有变量和特权方法的两种模式

   【1】【模块模式】:使用一个返回对象的匿名函数。在这个匿名函数的内部,首先定义了私有变量和函数。然后,将一个对象字面量作为函数的值返回。返回的对象字面量中只包含可以公开的属性和方法。由于这个对象是在匿名函数内部定义的。因此它的公有方法有权访问私有变量和函数。从本质上讲,这个对象字面量定义的是单例的公共接口。这种模式在需要对单例进行某些初始化,同时又需要维护其私有变量时非常有用。

var singleton = function(){
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        alert(1)
        return false;
    }
    //特权方法和属性
    return{
        publicProperty: true,
        publicMethod : function(){
            privateVariable++;
            return privateFunction();
        }
    }
}();
singleton.publicMethod();//弹出1

    [应用场景]用于管理组件的application对象

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

  【2】【增强模块模式】适合于那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其加以增强的情况。

var singleton = function(){
    //私有变量和私有函数
    var privateVariable = 10;
    function privateFunction(){
        alert(1)
        return false;
    }
    //创建对象
    var object = new CustomType();

    //特权方法和属性
    object.publicProperty = true;
    object.publicMethod = function(){
            privateVariable++;
            return privateFunction();
    };
    return object;
}();

    [应用场景]用于管理组件的application对象的增强模式

var application = function(){
    //私有变量和函数
    var components = new Array();
    //初始化
    components.push(new BaseComponent());
    //创建application的一个局部副本,这个变量实际上是application对象的局部变量版
    var app = new BaseComponent();
    //公共接口
    //返回已注册的数目
    app.getComponentCount = function(){
            return components.length;
    };
    //注册新组件
    app.registerComponent = function(component){
        if(typeof component == "object"){
            components.push(component);
        }
    }
    return app;
}();    

时间: 2024-10-19 15:48:41

函数中的私有变量和特权方法的相关文章

递归、闭包、私有变量、特权方法、单例、模块模式(module pattern)

//使用命名函数表达式实现递归 var factorial = (function f(num) {     if (num <= 1) {         return 1;     } else {         return num * f(num - 1);     } }); //用作块级作用域(私有作用域)的匿名函数 (function(){     var now = new Date();     if (now.getMonth() == 0 && now.get

私有变量和特权方法

1.定义 私有变量:js的作用域属于函数作用域 ,外部变量不能访问函数内部定义的变量  ,此变量为私有变量 特权方法:有权访问内部私有变量和方法的公有方法 2.定义对象的方式 一是使用Object实例化或者对象表达式 var TaoBao = (function() { // 私有属性 var _total = 10; // 私有方法var _buyFood = function() { _total--; }; var _getTotal = function() { return _tota

javascript在私有作用域中定义私有变量和私有函数 (1)

javascript没有私有成员,但是有私有变量,所有对戏那个属性都是公有的 任何在函数中定义的变量,都可以认为是私有变量,因为函数内部不能访问. 私有变量包括:函数的参数.局部变量.函数内部定义的其他函数 - 在私有作用域中定义私有变量和私有函数 function MyObject(){ //私有变量和私有函数 var privateVariable=10; function privateFunction(params) { return false } //特权方法----有权访问私有变量

ES6 class类中定义私有变量

ES6 class类中定义私有变量 class类的不足 看起来, es6 中 class 的出现拉近了 JS 和传统 OOP 语言的距离.但是,它仅仅是一个语法糖罢了,不能实现传统 OOP 语言一样的功能.在其中,比较大的一个痛点就是私有变量问题. 何为私有变量?私有变量就是只能在类内部访问的变量,外部无法访问的变量.在开发中,很多变量或方法你不想其他人访问,可以定义为私有变量,防止被其他人使用.在 Java 中,可以使用 private 实现私有变量,但是可惜的是, JS 中并没有该功能. 来

访问python中的私有变量

访问python中的私有变量 要给实习生培训python, 话说我自己都不怎么会用, 不能误人子弟, 再看看一些python中的概念吧. 看到类以及私有变量时, 想到以前看过文章, 说Python里面有私有函数也能被调用, 就顺手搜索了一下, stackoverflow有个问题就是问这个的. Why are Python's 'private' methods not actually private? HOW 类里面用两个下划线__打头的, 就是私有变量/函数 (后面会说到其实不是这样的) 照

实例甜点 Unreal Engine 4迷你教程(5)之函数中的静态变量

本小节的教程无前置教程,可直接学习,篇幅很短. 本教程浓缩起来就是一句话:函数中的静态变量在调试过程中保留值.所以需要谨慎对待. 什么意思?请先不要一步一步对着做,而整体地看一遍下面的过程: 第一步:创建一个空工程(C++ Basic Code),名为LearnArray: 第二步:创建两个Actor类分别称为:MyActor和sand: 第三步:在MyActor中有tick函数如下: ▼代码开始 // Called every frame void AMyActor::Tick(float D

OC中的私有变量和私有方法

在类的实现即.m文件中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private得.在 .m中定义的成员变量不能和它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是无效的 上面一堆废话~~~ 简单说就是.m文件中的成员只能自己使用,外面引用的都不可以用 方法也是一样的,没有在.h文件中声明,只在.m文件中实现 子类是无法继承的如果想访问,在当前类中使用self访问

mutable用于修改const成员函数中的成员变量

http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,

为什么C++中复制构造函数可以调取其他对象中的私有变量

私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明: 疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误? 1 class CTest { 2 public: 3 CTest(int i); 4 CTest(const CTest& rhs); 5 CTest