如何在 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 将函数视为一等对象,因此作为对象,您可以将属性分配给函数。
staticProperty
更新: ES6 引入了通过关键字声明类的能力。class它是现有基于原型的继承的语法糖。
class
static关键字允许您轻松地在类中定义静态属性或方法。
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"