Javascript 如何在ES6类中使用静态变量?
我试图在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您的
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之外的其他成员中的countget 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;
}
};