21
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScript のクラス構文で setter/getter をオーバーライドするとき

Last updated at Posted at 2016-03-07

たとえば以下のような 数値 を格納するクラスがあって、それを継承した 整数 を格納するクラスを作る場合。

class NumberHolder {
  constructor(value) {
    this.value = value;
  }

  set value(value) {
    this._value = +value || 0;
  }

  get value() {
    return this._value;
  }
}

class IntHolder extends NumberHolder {}

一見、set value だけをオーバーライドすれば良さそうだけど、実際は get value もオーバーライドしないといけない。

class IntHolder extends NumberHolder {
  set value(value) {
    super.value = value|0;
  }

  get value() {
    return super.value;
  }
}

理由

クラス構文で setter と getter をそれぞれ定義しているように見えるけど、実際はプロパティとして以下のようにニコイチで定義される。

Object.defineProperty(NumberHolder.prototype, "value", {
  set(value) {
    this._value = value;
  },
  get() {
    return this._value;
  },
  enumerable: false,
  configurable: false
});

サブクラスで setter だけをオーバーライドしようとすると、以下のように getter のないプロパティを定義してしまう。

Object.defineProperty(IntHolder.prototype, "value", {
  set(value) {
    this._value = value|0;
  },
  // get() がない
  enumerable: false,
  configurable: false
});
21
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?