Я пытаюсь выяснить, как Javascript полностью поддерживает ООП. К счастью, я могу найти какую-то подсказку через Babel и узнать, как она совместима с ES5.Статическое наследование переменных в Javascript (ES6)
Но я обнаружил, что статические переменные поведения странны в наследовании.
Например, я хочу запомнить глобальные свойства в суперклассе. Но похоже, что статическая переменная, доступная из подкласса, на самом деле не относится к суперклассу. Является ли это разумным в классическом ООП?
class Animal {
constructor(){
this.constructor.count += 1;
console.log('An animal was born');
}
static count = 0;
static sum = function(){
console.log('There are', this.count, 'animals');
}
}
class Cat extends Animal{
constructor(){
super(); // throws exception when not called
console.log(' -- the animal is a cat');
}
}
var cat1 = new Cat();
var cat2 = new Cat();
Cat.sum(); // should be 2
Animal.sum(); // should be 2, but result is 0
В приведенном выше был expermental синтаксис. Затем я увидел статью, в которой статическое свойство еще не поддерживается в ES6. Поэтому я следую его примеру переписывания в статический метод (геттер/сеттер), стиль, но до сих пор не получил никакого представления .....
class Animal {
constructor(){
this.constructor.countOne();
console.log('An animal was born');
}
static countOne(){
this.count = (this.count||0)+1;
}
static sum(){
console.log('There are', this.count, 'animals');
}
}
Animal.count = 0; // Remove this, Animal.sum() will be undefined
class Cat extends Animal{
constructor(){
super();
console.log(' -- the animal is a cat');
}
}
var cat1 = new Cat();
var cat2 = new Cat();
Cat.sum(); // should be 2
Animal.sum(); // should be 2, but result is 0
«это» относится к подклассу, не суперкласса, результат тот же ...
Кроме того, я пытаюсь тот же код в PHP, то я получил ожидаемый результат:
class Animal{
static $count = 0;
static function sum(){
echo "There are " . self::$count . " animals <br>";
}
public function __construct(){
self::$count++;
echo "An animal was born <br>";
}
}
class Cat extends Animal{
public function __construct(){
parent::__construct();
echo " - the animal is a cat <br>";
}
}
$cat = new Cat();
$cat = new Cat();
$cat = new Cat();
Cat::sum(); // is 3
Animal::sum(); // is 3
До сих пор мы должны сказать, что статическое наследование переменных не поддерживается Javascript? даже в ECMA6?
Есть ли изящное решение?
но ваш код в JS отличается от вашего PHP – Grundy
в двух словах: 'this.count' такое же как' self-> count' и не 'самостоятельно :: count' – Grundy
https: //devbank.wordpress.com/tag/static-variable-in-javascript/ может объяснить это – Gavriel