Есть ли сокращенный способ обернуть свойства объекта-компонента класса в javascript? - PullRequest
0 голосов
/ 18 января 2020

См. Фрагмент ниже:

class Bar {
  constructor(y) {
    this.y = y;
  }
}

class Foo {
  constructor(x, y) {
    this.x = x;
    this.bar = new Bar(y);
  }
  get y() {
    return this.bar.y;
  }
  set y(val) {
    this.bar.y = val;
  }
}

const foo = new Foo(1, 2);
console.log(foo.x, foo.y);

Я бы хотел использовать упрощенный способ отображения чего-то вроде (псевдокод) Foo.y = this.bar.y

Ответы [ 2 ]

1 голос
/ 18 января 2020

Yoo может расширить класс Bar и вызвать конструктор суперкласса со значением y.

class Bar {
  constructor(y) {
    this.y = y;
  }
}

class Foo extends Bar {
  constructor(x, y) {
    super(y);
    this.x = x;
  }
}

const foo = new Foo(1, 2);
console.log(foo.x, foo.y);
Или же вы можете просто скопировать свойство, используя метод Object.assign.

class Bar {
  constructor(y) {
    this.y = y;
  }
}
class Bar1 {
  constructor(z) {
    this.z = z;
  }
}

class Foo {
  constructor(x, y, z) {
    this.x = x;
    Object.assign(this, new Bar(y), new Bar1(z));
  }
}

const foo = new Foo(1, 2, 3);
console.log(foo.x, foo.y, foo.z);
0 голосов
/ 18 января 2020

Вы можете использовать вспомогательный метод для программного создания пар геттер / сеттер с помощью Object.defineProperties:

function createAccessors(o, path, properties) {
  for (const p of properties)
    Object.defineProperty(o, p, {
      get() { return path(this)[p]; },
      set(v) { path(this)[p] = v; },
    });
}

class Bar {
  constructor(y, z) {
    this.y = y;
    this.z = z;
  }
}

class Foo {
  constructor(x, y, z) {
    this.x = x;
    this.bar = new Bar(y, z);
  }
}
createAccessors(Foo.prototype, foo => foo.bar, ["y", "z"]);

const foo = new Foo(1, 2, 3);
console.log(foo.x, foo.y, foo.z);
...