繁体   English   中英

Javascript,扩展 ES6 类 setter 将继承 getter

[英]Javascript, extending ES6 class setter will inheriting getter

在 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不会从Base类继承get val()... 实际上,Javascript 在 setter 存在的情况下将 getter 的缺失视为未定义。

我有一种情况,我有很多类,它们都具有完全相同的 getter 集,但具有独特的 setter。 目前,我只是在每个类中复制 getter,但我正在重构并希望消除冗余代码。

有没有办法告诉 JS 使 getter 远离基类,或者有没有人对这个问题有一个优雅的解决方案?

这种限制是由于 JavaScript 在后台处理属性访问器的方式造成的。 在 ECMAScript 5 中,你最终会得到一个原型链,它有一个val属性描述符,一个由你的类定义的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 '5'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM