Javascript,扩展ES6类设置器将继承getter

时间:2018-12-02 21:16:26

标签: javascript extend es6-class boilerplate

在Javascript中,带有以下插图代码:

class Base {
   constructor() {  this._val = 1   }
   get val()     { return this._val }
}

class Xtnd extends Base {
   set val(v)    { this._val = v }
}

let x = new Xtnd();
x.val = 5;
console.log(x.val);  // prints 'undefined'

实例x将不会从get val()...类继承Base。照原样,Javascript将不存在getter和setter的情况视为未定义。

我遇到的情况是,我有许多类都具有完全相同的一组getter,但具有唯一的setter。目前,我只是在每个类中复制吸气剂,但是我正在重构并希望消除冗余代码。

是否有一种方法可以告诉JS保持基类中的getter,还是有人可以解决这个问题?

1 个答案:

答案 0 :(得分:5)

此限制是由于JavaScript如何处理后台的属性访问器。在ECMAScript 5中,您最终得到一个原型链,该链具有val的{​​{3}}和您的类定义的get方法,以及一个未定义的set方法。

在您的Xtnd类中,您还有一个val的属性描述符,它遮盖了基类val的整个属性描述符,其中包含由该类定义的set方法以及一个未定义的get方法。

为了将getter转发到基类实现,不幸的是,每个子类中都需要一些样板,但是您不必至少复制实现本身:

class Base {
   constructor() {  this._val = 1   }
   get val()     { return this._val }
}

class Xtnd extends Base {
   get val()     { return super.val }
   set val(v)    { this._val = v }
}

let x = new Xtnd();
x.val = 5;
console.log(x.val);  // prints 'undefined'