super(name, age, gender); // I haven't included the interests property here
Не добавляя аргумент в вызов функции, параметр неявно будет неопределенным. Поэтому верхний равен:
super(name, age, gender, undefined)
Следовательно, свойство interests
все еще существует, оно просто undefined
. Это действительно хорошее решение, если весь ваш код предполагает, что interests
не может быть определено. Если нет, например если вы выполняете вычисления с ним без явной проверки, ваши вычисления могут внезапно стать NaN, что может привести к некоторым проблемам:
if(person.age > 18) {
alert("adult");
} else alert("child"); // or maybe the person is not a child, and it's age property was just not set?
Теперь вместо того, чтобы установить в существующем свойстве значение, указывающее, что оно равно undefined
, вы можете вообще пропустить свойство interests
:
1) Перемещение в подкласс:
class Person {
constructor(name, age, gender) {
Object.assign(this, {name, age, gender });
}
}
class PersonWithInterests extends Person {
constructor(name, age, gender, interests) {
super(name, age, gender);
Object.assign(this, { interests });
}
}
2) Создать миксин:
Mixin - это класс, который может расширяться более чем на один класс. Если интерес интересует больше, чем человек, может быть полезно создать для него миксин:
const Interested = Super => class InterestMixin extends Super {
constructor(args) { // passing in an object here makes the Mixin more flexible, all superclasses have to deal with it though
super(args);
this.interests = args.interests;
}
};
class Animal { }
const PersonWithInterest = Interested(Person);
const AnimalWithInterest = Interested(Animal);
new PersonWithInterest({ name: "Jonas", interests: 10 })
new AnimalWithInterest({ type: "bear", interests: 20 })
(Если вы в конечном итоге создадите новый Mixin для каждого отдельного свойства, это решение больше не будет жизнеспособным. Если вы не можете сгруппировать несколько свойств в полезный Mixin, используйте первый способ (с дополнительными свойствами)) .