В вашем классе нет статических переменных (если под статической переменной вы подразумеваете статическое свойство). getCount
возвращает NaN
(после вызова increaseCount
), потому что Animal
изначально не имеет свойства count
. Затем increaseCount
делает undefined + 1
, что равно NaN
. Экземпляры, созданные new Animal
, изначально имеют свойство count
, а Animal
— только после вызова increaseCount
. this
в методе static
относится к самому классу Animal
(функция-конструктор) (если вы вызываете его через Animal.methodName(...)
).
Вы можете дать Animal
свойство count
:
Animal.count = 0;
Живой пример:
class Animal {
constructor() {
}
static increaseCount() {
this.count += 1;
}
static getCount() {
return this.count;
}
}
Animal.count = 0;
Animal.increaseCount();
console.log(Animal.getCount());
Animal.increaseCount();
console.log(Animal.getCount());
С предложением по полям статического класса (в настоящее время на этапе 3) вы можете сделать что декларативно с static count = 0;
в Animal
. Живой пример (Конфигурация Babel Stack Snippets, кажется, поддерживает его):
class Animal {
constructor() {
}
static count = 0;
static increaseCount() {
this.count += 1;
}
static getCount() {
return this.count;
}
}
Animal.increaseCount();
console.log(Animal.getCount());
Animal.increaseCount();
console.log(Animal.getCount());
С предложением private static (находится на этапе 3 и активно внедряется) вы можно даже сделать count
приватным:
class Animal {
constructor() {
}
static #count = 0;
static increaseCount() {
this.#count += 1;
}
static getCount() {
return this.#count;
}
}
Animal.increaseCount();
console.log(Animal.getCount());
Animal.increaseCount();
console.log(Animal.getCount());
Стек Snippets' Babel конфигурация не поддерживает, но вы можете запустить его жить в их REPL.
Боковое примечание: использование this
в статическом методе для ссылки на класс (функция-конструктор) немного сложно, если есть подклассы, потому что, например, если бы у вас было:
class Mammal extends Animal {}
а потом
Mammal.increaseCount();
this
в пределах increaseCount
(который он наследует от Animal
) относится к Mammal
, а не Animal
.
Если вам нужно такое поведение, используйте this
. Если нет, используйте Animal
в этих static
методах.
person
T.J. Crowder
schedule
17.07.2018