Javascript: '静态成员'

Javascript: Use case for 'static members'

本文关键字:静态成员 Javascript      更新时间:2023-09-26

"实例成员"和共享"类"成员之间的区别对我来说是显而易见的,使用一个或另一个的时间也是如此。但是我最近遇到了"静态成员"的概念,在Javascript中,它只是构造函数本身的方法/属性,通过this对任何实例都不可用。为了清晰起见,以下是我所说的:

var Constructor = function() {
  // Private instance members
  var private = 'I am private';
  // Public instance members
  this.public = 'I am public';
};
// Shared class members
Constructor.prototype.shared = 'I am shared';
// So-called 'static' member
Constructor.static = 'I am static';
var f = new Constructor();
f.private; // undefined
f.public; // 'I am public'
f.shared; // 'I am shared'
f.static; // undefined

就像我说的,前三者的目的和区别是显而易见的。然而,什么时候应该使用静态成员呢?什么时候Foo.bar()比仅仅使它成为类的共享方法更好:Foo.prototype.bar() ?

我理解原型链,所以明显的区别是静态成员不是实例原型链的一部分——我想这在某些应用程序中可能很重要。但这不是问题所在。问题是,创建这种"静态成员"的一个(或多个)好的、真实的例子是什么?

有一个(或更多)创建这样的"静态成员"的好例子吗?

语言本身就有一些很好的例子。例如(还有比这两个更多的):

Array.isArray([]); // true
Object.keys(someObj); // Returns array of key identifiers

静态属性对于提供与不依赖于实例的"类型"(上面示例中的数组或对象)相关的功能非常有用。

静态属性适用于需要一个在对象的所有实例中通用的值的情况。作为一个简单的例子,您可以让Constructor.numberOfTimesInstantiated在每次调用new Constructor时增加1。