访问在任意超类

时间:2017-01-25 12:38:02

标签: javascript class inheritance ecmascript-6

在JavaScript中,要访问直接父类中声明的(非静态)属性getter或setter,我们都应该知道,我们可以使用superfoo = super.barsuper.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?

1 个答案:

答案 0 :(得分:1)

我认为它不会比那更优雅/更简单。 JavaScript中没有super.super或类似内容。

你可以通过getPrototypeOf来改变原型链(尽管这样做并不是完全 super所做的事情,super使用原型该方法的[[HomeObject]],但不会那么复杂或更优雅。 :-)更灵活(例如,不是硬编码到A),但不是更优雅。