Подкласс JS со значениями по умолчанию - PullRequest
0 голосов
/ 06 июля 2019

У меня есть класс Atom (который представляет атом элемента в материальной вселенной):

class Atom {
    constructor(neutronCount) {
        this.neutronCount = neutronCount;
    }
}

Есть 92 естественных элемента - один из них, например, кислород. Я хотел бы создать подкласс для каждого из этих элементов.

class Oxygen extends Atom {
    // By default, an oxygen atom has 8 neutrons but this can change.
    // How can I define the subclass in such a way that Oxygen has 
    // 8 neutrons by default?
}

обычно встречающийся атом кислорода - количество нейтронов по умолчанию (8), но это может измениться, поэтому я хочу иметь возможность создать такой атом:

var o = new Oxygen(); // creates Oxygen with 8 neutrons
var o9 = new Oxygen(9); // create Oxygen with 9 neutrons

Как я могу определить подкласс кислорода таким образом, чтобы я мог ввести необязательный параметр (количество нейтронов)? И если я не введу параметр, он принимает значение по умолчанию 8?

Ответы [ 2 ]

3 голосов
/ 06 июля 2019

Используйте значение параметра по умолчанию :

class Oxygen extends Atom {
    constructor(neutronCount = 8) {
    // ---------------------^^^^
        super(neutronCount);
    }
}

Это примерно эквивалентно:

class Oxygen extends Atom {
    constructor(neutronCount) {
        if (neutronCount === undefined) {
            neutronCount = 8;
        }
        super(neutronCount);
    }
}

, поэтому 8будет использоваться в new Oxygen(), а также в new Oxygen(undefined).

Если хотите, вы можете даже добавить некоторую проверку диапазона перед вызовом super, если есть разумный диапазон для применения.Я ничего не знаю о молекулярной физике (или это химия?), Но, например, если разумным является только диапазон 5 <= x <10, то: </p>

class Oxygen extends Atom {
    constructor(neutronCount = 8) {
        if (neutronCount < 5 || neutronCount >= 10) {
            throw new Error(`Oxygen cannot have a neutron count of ${neutronCount}`);
        }
        super(neutronCount);
    }
}
0 голосов
/ 06 июля 2019

Другой вариант будет смешанным в классе:

 class Atom { }

  const AtomWithDefault = defaultNeutrons => class AtomWithDefault extends Atom {
    constructor(neutronCount = defaultNeutrons) {
       this.neutronCount = neutronCount;
    }
  };

  const Oxygen = AtomWithDefault(8);

  console.log(new Oxygen(9), new Oxygen);
...