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

本文介绍了JavaScript中特权方法的概念及其两种创建方式。一种是在构造函数中直接定义,这种方式的缺点是每个实例都会创建同样的新方法;另一种是通过静态私有变量的方式,在私有作用域中定义私有变量或函数,所有实例共享这些变量和函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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就此成为了一个全局变量,能够在私有作用域之外被访问到。

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

转载于:https://www.cnblogs.com/SLEBEE/p/3961892.html

### 回答1: 非静态方法可以通过在静态方法中创建实例来调用私有静态变量,例如,定义一个带有私有静态变量的类:class MyClass {private static int myVar = 0;public static void main(String[] args) {MyClass myObject = new MyClass();myObject.myMethod();}public void myMethod(){System.out.println(myVar);}}非静态方法myMethod()可以通过在静态方法中创建实例来调用myVar私有静态变量。 ### 回答2: 非静态方法如何调用私有静态变量主要有两种方式。 第一种方式是通过使用类的gettersetter方法间接访问私有静态变量。在类中,声明一个公有的静态方法用于获取私有静态变量的值,这个方法可以称为getter方法。同时,声明一个公有的静态方法用于设置私有静态变量的值,这个方法可以称为setter方法。通过调用这些gettersetter方法,非静态方法可以间接访问私有静态变量。 第二种方式是利用反射机制访问私有静态变量。通过使用Java的反射机制,可以在运行时获取修改私有静态变量的值。首先,通过反射获取到私有静态变量对应的Field对象,然后设置Field对象的accessible属性为true,以允许访问私有字段。接下来,使用Field对象的get方法获取私有静态变量的值,或者使用set方法设置私有静态变量的值。 总之,通过使用类的gettersetter方法或者利用反射机制,非静态方法可以调用私有静态变量。但需要注意的是,直接访问私有静态变量是不被允许的,因为私有静态变量只能在类的内部访问。 ### 回答3: 要在非静态方法中调用私有静态变量,需要先了解静态变量与实例变量的区别。 静态变量是属于类的变量,它被所有类的实例共享,可以被任何方法访问修改。私有静态变量是指在类中声明为私有修饰符的静态变量,只能在类的内部访问修改。 非静态方法则是属于类的实例方法,它只能被类的实例调用,无法直接调用属于类的静态变量。 要调用私有静态变量,可以通过以下步骤: 1. 在同一个类中,声明一个公有的实例方法,不要声明为静态方法。 2. 在该公有实例方法中,通过类名加点操作符(.)来访问私有静态变量。 下面是一个示例: ```java public class MyClass { private static int privateStaticVariable = 10; public void accessPrivateStaticVariable() { System.out.println("私有静态变量的值为:" + MyClass.privateStaticVariable); // 可以在非静态方法中访问私有静态变量 } } ``` 在这个示例中,我们定义了一个名为`MyClass`的类,其中包含一个私有静态变量`privateStaticVariable`。然后,我们在这个类中声明了一个公有实例方法`accessPrivateStaticVariable()`,在该方法中,我们通过类名`MyClass`来访问私有静态变量`privateStaticVariable`。 需要注意的是,虽然私有静态变量本身可以通过调用非静态方法来访问,但是修改私有静态变量的值仍然需要直接访问它的作用域(即在类中直接修改)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值