Синтаксис JavaScript class
создает одну функцию-конструктор и связанный объект-прототип. В JavaScript нет встроенной перегрузки функций, в том числе функций конструктора. Единственный способ сделать «перегрузку» в JavaScript - это обработать его в коде самой функции.
В вашем случае у вас есть пара вариантов, но самым простым будет, вероятно, просто использовать defaultЗначения параметров для всех параметров:
constructor(name = '', age = 0, sex = 'M', dni = createDni(), weight = 0, height = 0) {
this.name = name;
this.age = age;
this.sex = sex;
this.dni = dni;
this.weight = weight;
this.height = height;
}
Не беспокойтесь, createDni
вызывается только в том случае, если не указан аргумент для dni
при вызове конструктора (или если указано значение undefined
).
Одним из преимуществ этого является то, что вызывающая сторона может предоставить аргументы ни для одного из параметров, для всех или для любых промежуточных, а не только для 0, 3 и 6.
Live Пример:
function createDni() {
console.log("createDni was called");
return 42;
}
class Person {
constructor(name = '', age = 0, sex = 'M', dni = createDni(), weight = 0, height = 0) {
this.name = name;
this.age = age;
this.sex = sex;
this.dni = dni;
this.weight = weight;
this.height = height;
}
}
console.log("No arguments:");
console.log(JSON.stringify(new Person()));
console.log("Three arguments:");
console.log(JSON.stringify(new Person("Joe Bloggs", 42, "M")));
console.log("Six arguments:");
console.log(JSON.stringify(new Person("Joe Bloggs", 42, "M", 67, 182, 6)));
.as-console-wrapper {
max-height: 100% important;
}
Если вы действительно хотите, чтобы только не было аргументов, три аргумента или шесть аргументов, вы можете использовать параметр rest или объект arguments
. Использование arguments
будет выглядеть так:
constructor(name = '', age = 0, sex = 'M', dni = createDni(), weight = 0, height = 0) {
const alen = arguments.length;
if (alen !== 0 && alen !== 3 && alen !== 6) {
throw new Error("0, 3, or 6 arguments are required");
}
this.name = name;
this.age = age;
this.sex = sex;
this.dni = dni;
this.weight = weight;
this.height = height;
}
Использование параметра rest выглядит следующим образом, обратите внимание, что вы потеряете названные параметры:
constructor(...args) {
const alen = args.length;
if (alen !== 0 && alen !== 3 && alen !== 6) {
throw new Error("0, 3, or 6 arguments are required");
}
[
this.name = "",
this.age = 0,
this.sex = "M",
this.dni = createDni(),
this.weight = 0,
this.height = 0
] = args;
}
... где, опять же,createDni
вызывается только при необходимости.