JavaScript 中的静态变量
2022-08-29 22:27:10
如何在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"
你可以利用JS函数也是对象的事实 - 这意味着它们可以具有属性。
例如,引用(现已消失的)文章Javascript中的静态变量给出的示例:
function countMyself() {
// Check to see if the counter has been initialized
if ( typeof countMyself.counter == 'undefined' ) {
// It has not... perform the initialization
countMyself.counter = 0;
}
// Do something stupid to indicate the value
alert(++countMyself.counter);
}
如果多次调用该函数,您将看到计数器正在递增。
这可能比使用全局变量来 polten 全局命名空间要好得多。
这是另一个可能的解决方案,基于闭包:在javascript中使用静态变量的技巧:
var uniqueID = (function() {
var id = 0; // This is the private persistent value
// The outer function returns a nested function that has access
// to the persistent value. It is this nested function we're storing
// in the variable uniqueID above.
return function() { return id++; }; // Return and increment
})(); // Invoke the outer function after defining it.
这会得到相同类型的结果 - 除了这次,增量值被返回,而不是显示。