1. ホーム
  2. javascript

[解決済み] JavaScriptの静的変数

2022-03-18 12:24:41

質問

Javascriptで静的変数を作成するにはどうすればよいですか?

どのように解決するのですか?

クラスベースの静的型付けオブジェクト指向言語から来た場合 (Java、C++、C#など) インスタンスではなく、"type"に関連する変数やメソッドを作成しようとしているのだと思います。

コンストラクタ関数を使った古典的なアプローチの例は、基本的な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 は関数を次のように扱います。 第一級オブジェクト そのため、オブジェクトである関数にプロパティを割り当てることができます。

UPDATEしてください。 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"