gpt4 book ai didi

Javascript,扩展ES6类setter会继承getter

转载 作者:数据小太阳 更新时间:2023-10-29 06:09:18 24 4
gpt4 key购买 nike

在 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,但我正在重构并希望消除冗余代码。

有没有办法告诉 JS 将 getter 保留在基类中,或者有人有解决这个问题的优雅方法吗?

最佳答案

此限制是由于 JavaScript 在幕后处理属性访问器的方式。在 ECMAScript 5 中,您最终会得到一个具有 property descriptor 的原型(prototype)链。对于 valget类定义的方法,以及 set未定义的方法。

在你的Xtnd class 你有另一个属性描述符 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'

关于Javascript,扩展ES6类setter会继承getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com