当前位置: 首页 > 面试题库 >

JavaScript中的静态变量

袁耀
2023-03-14
问题内容

如何在Javascript中创建静态变量?


问题答案:

如果您来自基于类的静态类型的面向对象的语言(例如Java,C++或C#),那么我假设您正在尝试创建与“类型”相关但与实例无关的变量或方法。

使用带有构造函数的“经典”方法的示例可能会帮助您了解基本的OO JavaScript概念:

function MyClass () { // constructor function
  var privateVariable = "foo";  // Private variable

  this.publicVariable = "bar";  // Public variable

  this.privilegedMethod = function () {  // Public Method
    alert(privateVariable);
  };
}

// Instance method will be available to all instances but only load once in memory 
MyClass.prototype.publicMethod = function () {    
  alert(this.publicVariable);
};

// Static variable shared by all instances
MyClass.staticProperty = "baz";

var myInstance = new MyClass();

staticProperty是在MyClass对象(它是一个函数)中定义的,并且与创建的实例无关,JavaScript将函数视为一等对象,因此作为对象,可以为函数分配属性。

更新: ES6引入了通过关键字声明类的功能class。它是对现有基于原型的继承的语法糖。

static关键字允许您轻松地在一个类中定义的静态属性或方法。

让我们看一下上面用ES6类实现的示例:

class MyClass {

  // class constructor, equivalent to

  // the function body of a constructor

  constructor() {

    const privateVariable = 'private value'; // Private variable at the constructor scope

    this.publicVariable = 'public value'; // Public property



    this.privilegedMethod = function() {

      // Public Method with access to the constructor scope variables

      console.log(privateVariable);

    };

  }



  // Prototype methods:

  publicMethod() {

    console.log(this.publicVariable);

  }



  // Static properties shared by all instances

  static staticProperty = 'static value';



  static staticMethod() {

    console.log(this.staticProperty);

  }

}



// We can add properties to the class prototype

MyClass.prototype.additionalMethod = function() {

  console.log(this.publicVariable);

};



var myInstance = new MyClass();

myInstance.publicMethod();       // "public value"

myInstance.additionalMethod(); // "public value"

myInstance.privilegedMethod(); // "private value"

MyClass.staticMethod();             // "static value"


 类似资料:
  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

  • 我有以下代码: 当我尝试编译它时,会出现以下错误: 因此,我尝试使dbConnect静态如下:

  • 静态变量 PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期,而局部变量中有一种特殊的类型:静态变量,它们不会在函数执行完后释放,当程序执行离开函数域时静态变量的值被保留下来,下次执行时仍然可以使用之前的值。 PHP中的静态变量通过

  • 问题内容: 通常,最终静态成员,尤其是变量(或静态最终变量,当然可以以任何顺序使用,而不会重叠含义)已广泛用于Java接口中,以定义实现类的 协议行为 ,这意味着实现该类的类(继承)接口必须包含该接口的所有成员。 我无法区分 final 和 final静态 成员。final静态成员是一个声明为final或其他东西的静态成员?在哪些特定情况下应专门使用它们? 永远不能在方法内部,静态方法内部或实例方

  • 问题内容: 在 多线程中 。我认为这是因为。这是唯一原因吗? 我知道。但为什么? 问题答案: 在多线程中,static没有意义。 恐怕你在做相反的陈述 。静态变量是一种共享资源,可用于在不同线程之间交换某些信息。而且,在访问这种共享资源时我们需要小心。因此,我们需要确保在多线程环境中对静态变量的访问是同步的。 每个线程都有自己的堆栈 这是正确的说法。堆栈仅保存局部变量,而不保存堆中的变量。静态变量