关于私有变量,静态私有变量

有权访问私有变量和私有函数的公有方法称之为特权方法,对象上创建特权方法的方式有两种。

第一种:直接在构造函数中定义特权方法,基本模式如下

function MyObject(){
    var privateVariable = 10;
    function privateFunction(){
        alert(1);
    }

    this.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    }//特权方法
}
var aa = new MyObject();
aa.publicMethod();
this.publicMethod 方法作为MyObject函数的闭包因而有权访问在构造函数中定义的变量和方法,aa实例中,除了用publicMethod()这个特权方法来访问外,没有任何其他办法直接访问privateVariable和privateFunction()。在这个实例中
publicMethod()即为 构造函数MyObject的特权方法之一。

构造函数中定义特权方法有一个缺点,就是必须使用构造函数模式来达到这个目的,而构造函数模式的缺点是每个实例都会创建同样的一组新方法。

静态私有变量

通过在私有作用域中定义私有变量或函数同样可以创建特权方法,基本模式如下
(function(){
    var praviteVariable = 10;
    function praviteFunction(){
        return false;
    }
    MyObject = function(){

    }
    MyObject.prototype.publicMethod = function(){
        privateVariable++;
        return privateFunction();
    }
})();

这个模式中创建了一个私有作用域,里面封装了一个构造函数。公有方法使用了原型定义,这个模式在定义构造函数式没有使用函数声明,也没有在声明MyObject时使用var,那么由于未经初始化的变量总是会创建一个全局变量的缘故,MyObject就此成为了一个全局变量,能够在私有作用域之外被访问到。

这种模式与构造函数中定义特权方法的主要区别在于,这种方法下私有变量和函数是由实例共享的,由于这个特权方法实在原型上定义的,因此所有的实例都使用同一个函数,但是因为这个特权方法是作为一个闭包,因此这个闭包总是包含着作用域的引用,导致的后果就是每个创建的实例所使用引用的变量都是一样的,即不管哪个实例改变了变量的值,其他实例中这个变量的值也会被改变,因为这个特权方法总是保存着对包含作用域的作用。

时间: 2024-10-11 23:01:01

关于私有变量,静态私有变量的相关文章

js模拟的静态私有变量

Javascript静态变量与实例变量 博客分类: JavaScript 严格的来讲,js里面并没有静态与私有的概念,所有成员属性都是公开的,下面只是参考OO语言,通过某种方式来实现类似的概念. 一.静态变量 1.私有静态变量 所有实例共享.因为是私有的变量,所以不能通过函数名直接访问.通过闭包来实现. 根据闭包的作用域原理,只能在闭包内部访问.所以,并不是类的任何地方都可以访问这个静态变量.只有类的构造函数或者方法(原型方法),在闭包内部才可以访问. Js代码   (function(){ v

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

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

类的私有变量和私有方法

类的私有变量和私有方法 格式:双下划线+变量名/方法名,变量分为静态变量和动态变量 私有变量和方法只能在本类中的方法内调用,不能在类以外调用 私有变量和方法也不能通过类来继承,不能通过子类调用 如果希望通过对象直接调用私有变量和方法,可以使用**obj._类名__变量名/方法名**来调用,但是这种方法是python3的一个bug,工作中不能使用. class Person(object): skin_color = '黄色' __num = 'one' # __变量名表示的是私有的静态字段 de

JS中的 公有变量、私有变量 !

公有变量.私有变量 ! 初学者的见解,算是记录学习过程,也算是分享以便共同成长,如有不正确的地方,还请不吝赐教! 先看代码1: function car(){ var wheel = 3; //私有变量 this.wheel = 4; //公有变量 alert(wheel); alert(this.wheel); } var car1 = new car();结果是:3 4 代码2: function car(){ var wheel = 3;//私有变量 this.wheel = 4;//公有

OC-私有方法和私有变量

以前没有太注意这个私有方法和私有变量,后来吃了很多亏, 今小总结一下: 1> 私有方法 概念:就是没有在.h文件中声明,只在.m文件实现的方法. 使用:私有方法只能在本类中使用,不能在子类和分类中使用. 2>私有变量 概念1:就是在.m文件中定义的变量 概念2:就是通过@property自动生成的私有成员变量; 使用:私有变量也是只能在本类中使用,分类和子类都不能使用. 3>声明为私有的变量 概念:声明为私有的变量,就是在.h文件中,定义的成员变量之前修饰符为@private. 使用:

oc中私有变量、私有方法

oc中私有变量.私有方法 私有变量 私有变量既是类的成员变量,仅能在类的内部使用,不受外部访问 定义方法有: 1. 定义在.h文件的{}中,使用关键字@private,如: @interface Test () { @private NSString *string_; } @end 1 2 3 4 5 6 2.也是定义在.h文件的{}中,但不使用关键字@private 3.定义在.m文件的@property,如下: @interface Test () @property (nonatomic

Object-C 中私有变量和私有方法

1.在OC中有私有变量和私有方法,声明变量的时候 使用 @private 关键字 仍然可以使用指向运算符来 查看,如下: @interface Clip : NSObject { @private int _cbullet; int _times; } 在main.m 中仍可以使用p->_cbullet; 来查看,但是无法访问. 在OC中 @interface和@implementation 都可以定义实例变量. #import "Clip.h" @implementation

Java Reflection(七):私有变量和私有方法

转载自并发编程网 – ifeve.com 内容索引访问私有变量访问私有方法 在通常的观点中从对象的外部访问私有变量以及方法是不允许的,但是Java反射机制可以做到这一点.使用这个功能并不困难,在进行单元测试时这个功能非常有效.本节会向你展示如何使用这个功能. 注意:这个功能只有在代码运行在单机Java应用(standalone Java application)中才会有效,就像你做单元测试或者一些常规的应用程序一样.如果你在Java Applet中使用这个功能,那么你就要想办法去应付Securi

私有属性,私有方法,类变量,实例变量,单下划线,双下划线

1.私有属性__age,不能通过实例对象直接调用,而是通过一个方法来调用 class Dog: def __init__(self, new_age): self.__age = new_age def get_age(self): return self.__age wang_cai = Dog(1) result = wang_cai.get_age() print(result) 2.私有方法,通过一个共有方法来调用 class Dog(object):   def __init__(se