たとえば以下のような 数値 を格納するクラスがあって、それを継承した 整数 を格納するクラスを作る場合。
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
});