Javascript 如何在ES6类中使用静态变量?

Javascript 如何在ES6类中使用静态变量?,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,我试图在es6中使用静态变量。我想在Animal类中声明一个静态变量count,并增加它。但是,我无法通过staticcount=0声明静态变量,所以我尝试了另一种方式: 类动物{ 构造函数(){ 此值为0.count; } 静态递增计数(){ 这是1.count+=1; } 静态getCount(){ 返回这个.count; } } console.log(Animal.increaseCount());//未定义 console.log(Animal.getCount());//NaN您的

我试图在es6中使用静态变量。我想在
Animal
类中声明一个静态变量
count
,并增加它。但是,我无法通过
staticcount=0声明静态变量,所以我尝试了另一种方式:

类动物{
构造函数(){
此值为0.count;
}
静态递增计数(){
这是1.count+=1;
}
静态getCount(){
返回这个.count;
}
}
console.log(Animal.increaseCount());//未定义

console.log(Animal.getCount());//NaN
您的类没有静态变量(如果静态变量指的是静态属性)
getCount
返回
NaN
(在调用
increaseCount
之后),因为
Animal
最初没有
count
属性。然后
increaseCount
执行
undefined+1
,即
NaN
。由
new Animal
创建的实例最初具有
count
属性,但是
Animal
本身在调用
increaseCount
之前不会
static方法中的这个
指的是
Animal
类(构造函数)本身(如果您通过
Animal.methodName(…)调用它)

您可以给
Animal
一个
count
属性:

Animal.count = 0;
实例:

类动物{
构造函数(){
}
静态递增计数(){
这是1.count+=1;
}
静态getCount(){
返回这个.count;
}
}
动物计数=0;
动物。增加计数();
console.log(Animal.getCount());
动物。增加计数();

console.log(Animal.getCount())要设置静态变量,请在对象动物本身上设置它。到目前为止,在Javascript中,不能像声明静态方法那样直接在类内声明静态属性

class Animal {
    constructor() {
    }

    static increaseCount() {
        this.count += 1;
    }

    static getCount() {
        return this.count;
    }
}
Animal.count = 0;
console.log(Animal.increaseCount());
console.log(Animal.getCount()); 

静态类端属性和原型数据属性必须在类主体声明之外定义

类动物{
静态递增计数(){
动物计数+=1;
}
静态getCount(){
返回动物计数;
}
}
动物计数=0;
动物。增加计数();

console.log(Animal.getCount());//未定义
如其他答案中所述,
此.count
指的是
构造函数中的实例属性
。为了初始化静态属性,应设置
Animal.count

为运输工具(Babel等)提供的
Animal.count=0
提供语法糖:

ES6中的另一种选择是使用初始值,在这种情况下,
Animal.count
initial value不需要明确设置,例如:

class Animal {    
  static increaseCount() {
    this.count = this.getCount() + 1;
  }

  static getCount() {
    return this.count || 0;
  }
}
JavaScript类中不欢迎访问器方法-这就是getter/setter描述符的用途:

class Animal {    
  static increaseCount() {
    this.count += 1;
  }

  static get count() {
    return this._count || 0;
  }

  static set count(v) {
    this._count = v;
  }
}
在JavaScript中,仅静态类被视为反模式,因为不使用特定于类的状态或其他特性。如果只有一个实例,则应使用普通对象(除非有其他问题可以从
类中受益):


您可以使用闭包来模拟静态变量

const Animal=(()=>{
让计数=0;
类动物{
构造函数(){}
静态递增计数(){
计数+=1;
}
静态getCount(){
返回计数;
}
}
返回动物;
})();
console.log(Animal.getCount());
动物。增加计数();

console.log(Animal.getCount())参见
未定义+1=NaN
是否允许
静态计数=0
动物
类中?它会导致语法错误:意外标记。我将Babel和Webpack一起使用。@Caesium133-正如我前面所说的,这是目前处于过程第3阶段的一部分(所以,它还不在规范中,引擎现在才想添加它)。如何将increaseCount添加到新动物的构造器中?归根结底,这不是人们通常在课堂上使用计数器的原因吗?看来你没有证明这一点。(虽然我认为,
count
应该是集合的属性,而不是实例类——使count成为类的静态属性是一种“低预算”集合,嗯?
static count=0;
这些天似乎很管用……我在做梦吗?但是,它与Java的非常不同static@OhadR-不,你不是在做梦。:-)V8(在Chrome、Node.js、Brave、Chrome、new Edge等中)和SpiderMonkey(在Firefox 75+中)都已开始支持
静态
公共字段。Safari仍在进行中。可以,但最后一行代码返回1,不是未定义的。这可能会误导newbieToday,您不必再在外部声明它,但您的getter和setter函数不是访问器方法吗?getCount不是访问器方法吗?您的带有getter和setter的Animal类返回0,并带有:
let b=new Animal;控制台日志(动物计数)我想说,更有用的是,当创建新实例时,带有get/set的类应该自我递增。如果_count==0,则最终的对象样式实际上不会返回_count的值。当_count实际上未定义时,它返回0。这是一个错误的结果。我会认为这是一个错误。由于该对象需要在外部将count初始化为0,因此它似乎与仅使用变量没有什么不同。行为与变量相同的对象是否被视为反模式?@johnywhy谢谢注意,有一个输入错误,应该是this.count而不是this.\u increaseCount和get/set count之外的其他成员中的count
get count(){返回此值。_count | | | 0}
\u count:0,get count(){返回此值。_count}
基本相同。我更喜欢
||0
,因为它需要更少的字符来键入,并且还修复了一些无效值,可以将其更改为
set
中的_count=+v || 0
,以更好地调节值。这取决于它是否是反模式。对象可以扩展,并且更易于测试
class Animal {    
  static increaseCount() {
    this.count += 1;
  }

  static get count() {
    return this._count || 0;
  }

  static set count(v) {
    this._count = v;
  }
}
const animal = {    
  increaseCount() {
    this.count += 1;
  },

  get count() {
    return this._count || 0;
  },

  set count(v) {
    this._count = v;
  }
};