Несколько конструкторов в классе. Javascript - PullRequest
0 голосов
/ 28 октября 2019

Так вот, что они просят меня сделать: 1) Создайте класс с именем Person с соблюдением следующих условий. Атрибуты: имя, возраст, DNI, пол (M для мужчины, F для женщины), вес и рост. Каждый атрибут, кроме DNI, будет иметь значения по умолчанию в соответствии с его типом (0 для чисел, пустая строка для String и т. Д.). Пол будет по умолчанию мужчиной.

2) Создайте следующие конструкторы: • Конструктор со значениями по умолчанию. • Конструктор с именем, возрастом и полом в качестве параметров (другие значения по умолчанию). • Конструктор со всеми атрибутами, полученными в качестве параметров.

Мне нужно знать правильный способ сделать это, чтобы иметь возможность создавать 3 объекта класса с разными значениями.

class Person {
constructor(name, age, sex, dni, weight, height){
    this.name = '';
    this.age = 0;
    this.sex = 'M';
    this.dni = createDni();
    this.weight = 0;
    this.height = 0;
}

static Person1(name, age, sex){
    return new Person(name,age,sex);
}

static Person2(name, age, sex, dni, weight, height){
    return new Person(name, age, sex, dni, weight, height);
}
}

var Person1 = new Person(){
this.name = 'Manuel'
this.age = 25;
this.sex = 'M';
this.height = 1,75;
this.weight = 90;
}

Я должен иметь возможность передавать разные значения 3 различным объектам, созданным из «Класса».

Ответы [ 2 ]

1 голос
/ 28 октября 2019

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

class Contract {
    static notNull(value, message) { if(!value) throw new Error(message);  }
    static isArray(value, message) { if(!Array.isArray(value)) throw new Error(message);  }
    static isTrue(value, message)  { if(!value) throw new Error(message);  }
}

class Person {
    constructor (dni, name = "", age = 0, sex='M', width=0, height=0) {
        Contract.notNull(dni, "Parameter dni not specified");
        //check other parameters as well 
        this.dni = dni;
        this.name = name; // etc.
    }

    static fromArray(values) {
        Contract.isArray(values, "Parameter values must be array");
        Contract.isTrue(values.length === 6, "Expected 6 elements in array");
        return new Person(...values);
    }

    static fromNameAgeAndSex(name, age, sex) {
          return new Person(createDni(), name, age, sex);
    }
}
1 голос
/ 28 октября 2019

Синтаксис 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 вызывается только при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...