Javascript: создание экземпляров классов с помощью JSON - PullRequest
0 голосов
/ 09 октября 2018

У меня есть класс "House", например:

class House{
    constructor(params){
       this.clear();
       // this = {...params} // I know that don't work !!!
       //--
       // if(params.address !== undefined) this.address = {...params.address}
       //...
    }

    clear(){
      this.address = {
         number: null,
         street: null,
         zipcode: null,
         ton: null,
      }
      this.access = {
         doorcode: null,
         stair: null,
      }
    }
}

Я хочу создать новый экземпляр House и добавить в конструктор несколько json, например:

const h = new House({address: { /* json */ }, access: { /* json */});

Или только одиннапример:

const h = new House({access: { /* json */});

В конструкторе я обязан проверять все значения в «params» для вставки в хорошие свойства (вложенный объект)

Я хотел бы избежать создания других классов, таких какадрес и доступ и в конструкторе дома создайте новый экземпляр каждого.Какая лучшая практика?

С уважением

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Я думаю, что вам нужно общее пространство имен для свойств вашего экземпляра - подобно шаблону props в React - вы также можете указать значения по умолчанию для каждого создаваемого экземпляра:

const defaultProps = { address: {}, access: {} };

class House {
  constructor(props = {}) {
    this.props = {...defaultProps, ...props};
  }
  clear() {
    this.props = {...defaultProps};
  }
}
0 голосов
/ 09 октября 2018

Используя Object.assign() и деструктуризацию объекта с параметрами по умолчанию в constructor, вы можете достичь этого довольно легко:

class House {
  static get defaultAddress () {
    return {
      number: null,
      street: null,
      zipcode: null,
      town: null
    }
  }

  static get defaultAccess () {
    return {
      doorcode: null,
      stair: null
    }
  }

  constructor({ address = House.defaultAddress, access = House.defaultAccess } = {}) {
    this.clear()
    Object.assign(this.address, address)
    Object.assign(this.access, access)
  }

  clear () {
    const { defaultAddress, defaultAccess } = House

    Object.assign(this, { address: defaultAddress, access: defaultAccess })
  }
}

// no object
console.log(new House())
// empty object
console.log(new House({}))
// partial object
console.log(new House({ address: { number: 1, street: 'street', zipcode: 12345, town: 'town' } }))
// empty sub-objects
console.log(new House({ address: {}, access: {} }))
// partial sub-objects
console.log(new House({ address: { number: 1, street: 'street' }, access: { doorcode: 321 } }))
// complete object
console.log(new House({ address: { number: 1, street: 'street', zipcode: 12345, town: 'town' }, access: { doorcode: 321, stair: 3 } }))
.as-console-wrapper{min-height:100%!important}
0 голосов
/ 09 октября 2018

Вы можете просмотреть параметры и установить их вручную.Затем, чтобы очистить, удалите все собственные свойства (свойства, которые не наследуются).

class House {
  constructor(params) {
    // set data
    Object.assign(this, params);
  }

  clear() {
    for (let key in this) {
      if (this.hasOwnProperty(key))
        this[key] = undefined;  // or `delete this[key];`
    }
  }
}

let house = new House({type: "normal", height: 40});
console.log(house, house instanceof House);

Конечно, вы, вероятно, хотите ограничить входные ключи предопределенным набором.Вы можете хранить эти ключи в статической переменной класса и использовать их для циклического перебора свойств в constructor и clear.

class House {
  constructor(params) {
    // check for invalid properties
    Object.keys(params).forEach(key => {
      if (!House.keys.includes(key)) 
        throw `Invalid paramater ${key}`;
    });
    // set data
    Object.assign(this, params);
  }

  clear() {
    for (let key in House.keys) {
      if (this.hasOwnProperty(key))
        this[key] = undefined;  // or `delete this[key];`
    }
  }
}
House.keys = ['type', 'height'];

let house = new House({type: 'normal', height: 40});
console.log(house, house instanceof House);

let error = new House({helloWorld: true});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...