Обновление объекта изнутри объекта - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь найти способ обновить объект изнутри объекта, хотя я не уверен, возможно ли это.

Что я подразумеваю под refresh , так это заменить текущий объект, вызвав метод вместо присваивания.

Этот код найдет каждый элемент ввода и сохранит ссылку на элемент и свойства name и value каждого элемента в отдельном массиве.

HTMLElement.prototype.getChildInputs = function() {
  let eles = [...this.querySelectorAll("input")];
  return {
    eles,
    fields: eles.map(ele => {
      return {
        name: ele.name,
        value: ele.value || ""
      }
    }),
    refresh: function() {
      return this.getChildInputs();
    }
  }
}

Примечание Имейте в виду, что это минимальный пример

HTMLElement.prototype.getChildInputs = function() {
  let eles = [...this.querySelectorAll("input")];
  return {
    eles,
    fields: eles.map(ele => {
      return {
        name: ele.name,
        value: ele.value || ""
      }
    }),
    refresh: function() {
      return this.getChildInputs();
    }
  }
}

let i = document.querySelector(".container").getChildInputs();
console.log(i);
<div class="container">
  <div class="field">
    <label>first name</label>
    <input name="f_name" />
  </div>
  <div class="field">
    <label>last name</label>
    <input name="l_name" />
  </div>
  <hr/>
  <div class="field">
    <label>username</label>
    <input name="username" />
  </div>
  <div class="field">
    <label>password</label><input name="password" type="password">
  </div>
</div>

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

i = i.refresh();

Я бы хотел просто написать

i.refresh();

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

HTMLElement.prototype.getChildInputs = function() {
  ...
  return {
    ...,
    refresh: function() {
      this = this.getChildInputs();
    }
  }
}

Приводит меня к мысли, что это может быть невозможно, но, возможно, я неправильно думаю о проблеме. Любая помощь будет отличной.

1 Ответ

0 голосов
/ 08 ноября 2018

Может, вот так?

HTMLElement.prototype.getChildInputs = function() {
  const parent = this;
  return {
    eles: [...parent.querySelectorAll("input")],
    get fields() {
      this.eles.map(ele => {
        return {
          name: ele.name,
          value: ele.value || ""
        }
      })
    },
    refresh() {
      this.eles = [...parent.querySelectorAll("input")]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...