Как создать сложную структуру объекта в javascript?

#javascript #node.js #express #ecmascript-6

#javascript #node.js #выражать #ecmascript-6

Вопрос:

Я пытаюсь создать структуру объекта, используя классы в javascript. У меня есть проблема с созданием объектов, которые включают вложенную структуру. Например ..

 {
    "id" : 1,
    "name" : "mark",
    "phoneNumber" : "123456789",
    "dob" : "2010-08-20",
    "address" : {
        "latitude" : 123214.1231,
        "longitude" : 1231243.12,
        "houseNumber" : "1-2-3",
        "landmark" : "square-garden",
        "pinCode" : "134567876"
    }
}
  

address недвижимость имеет отдельную внутреннюю структуру. Как создать класс для вышеупомянутого JSON?
Я немного новичок в JS. Пожалуйста, помогите мне. Ниже приведены вещи, которые я пробовал.

У меня есть класс UserCreationDto

 class UserCreationDto {

    id;
    name;
    phoneNumber;
    dob;
    address;

    constructor(id, name, phoneNumber, dob, address) {
        this.id = id;
        this.name = name;
        this.phoneNumber = phoneNumber;
        this.dob = dob;
        this.address = address;
    }
}
  

и класс AddressDto

 class AddressDto {

    latitude;
    longitude;
    houseNumber;
    landmark;
    pinCode;

    constructor(latitude, longitude, houseNumber, landmark, pinCode) {
        this.latitude = latitude;
        this.longitude = longitude;
        this.houseNumber = houseNumber;
        this.landmark = landmark;
        this.pinCode = pinCode;
    }
}
  

Я хочу address , чтобы свойство of UserCreationDto было of AddressDto . Как я могу это сделать? UserCreationDto Можно использовать вышеуказанный класс.
Но, когда я это делаю, IntelliSense отсутствует

 let userCreationDto = new UserCreationDto();
userCreationDto.address.{i-get-random-properties-here}
  

Я пытался сделать это

 UserCreationDto.prototype.address=new AddressDto()
  

С помощью описанного выше подхода я получил IntelliSense, но при использовании прототипа значения являются общими для всех экземпляров UserCreationDto .

Если я просто продолжу с вышеупомянутым классом UserCreationDto , то я не получу никакого IntelliSense.

IDE позволяют чему-либо подталкивать к address собственности.

Как создать вложенную структуру, как обсуждалось выше? Какой может быть классовая структура?

Комментарии:

1. new UserCreationDto (1, 2, 3, 4, new AddressDto(1, 2, 3, 4, 5))

2. @VLAZ Как написать класс для этого? Создание экземпляра объекта — это нормально. Помогите мне в создании класса.

3. Вы создали классы. Если вы правильно создадите их экземпляры, то также получите правильные данные. jsbin.com/vijeqoroqi/edit?js ,консоль

4. @VLAZ вы говорите, что вышеуказанные классы подходят. Итак, когда я получаю объект, подобный указанному выше, из какого-либо http-post-запроса, сначала я должен создать AddressDto , заполнить его. затем создайте UserCreationDto и присвоите свойство address уже созданному экземпляру AddressDto. Это будет работать нормально. Есть ли какой-нибудь способ получить intellisense? Я имею в виду, мы получаем intellisense для id, name, PhoneNumber, dob, address, поскольку они являются прямыми свойствами класса. Как получить intellisense поверх свойств адреса из экземпляра userCreationDto?

5. @protonsphere Какую среду IDE вы используете? Вам нужно будет сообщить intellisense, что address свойство имеет тип AddressDto .

Ответ №1:

Я думаю, что этот способ работает, вместо использования класса просто используйте функции:

 function AddressDto(latitude, longitude, houseNumber, landmark, pinCode) {
    this.latitude = latitude || 0;
    this.longitude = longitude || 0;
    this.houseNumber = houseNumber || '';
    this.landmark = landmark || '';
    this.pinCode = pinCode || '';
}
    
function UserCreationDto(id, name,phoneNumber, dob, address) {
    this.id = id || 0;
    this.name = name || '';
    this.phoneNumber = phoneNumber || '';
    this.dob = dob  || '';
    this.address = address || new AddressDto();
}

const user = new UserCreationDto();
user.id = 1;
user.name = 'test';
user.phoneNumber = '1234567890';
user.dob = '12/12/12';
console.log(user.address.latitude);
  

Спасибо