一尘不染

JavaScript中的静态变量

javascript

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


阅读 591

收藏
2020-04-25

共1个答案

一尘不染

如果您来自基于类的静态类型的面向对象的语言(例如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"
2020-04-25