在JavaScript中,要访问直接父类中声明的(非静态)属性getter或setter,我们都应该知道,我们可以使用super
: foo = super.bar
或super.foo = bar
。
访问超级超类(或下一个父级以外的超类)中声明的重写属性的正确方法是什么?
我到目前为止找到的最佳解决方案是使用Relect.get
。它当然有效,但它非常丑陋,看起来像一个黑客。我希望你理解我的感受。
class A {
get foo() {
console.log('evaluating A.foo');
return this.a;
};
}
class B extends A {
get foo() {
console.log('evaluating B.foo');
return this.b;
};
}
class C extends B {
get foo() {
// Can we get this better?
return Reflect.get(A.prototype, 'foo', this);
}
}
const c = new C;
c.a = 'ok';
c.b = 'not ok';
console.log(c.foo);

是否有一种优雅的方式来访问在任意超类中声明的属性getter / setter?
答案 0 :(得分:1)
我认为它不会比那更优雅/更简单。 JavaScript中没有super.super
或类似内容。
你可以通过getPrototypeOf
来改变原型链(尽管这样做并不是完全 super
所做的事情,super
使用原型该方法的[[HomeObject]]
,但不会那么复杂或更优雅。 :-)更灵活(例如,不是硬编码到A
),但不是更优雅。