javascript 为什么私有静态成员不能通过子类访问?

afdcj2ne  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(168)

来自MDN Web Docs:
对私有静态字段有限制:只有定义私有静态字段的类才能访问该字段。这可能会导致使用this时出现意外行为。在下面的示例中,当我们尝试调用SubClass.basePublicStaticMethod()时,this引用了SubClass类(而不是BaseClassWithPrivateStaticField类),因此导致TypeError。

class BaseClassWithPrivateStaticField {
  static #PRIVATE_STATIC_FIELD;

  static basePublicStaticMethod() {
    return this.#PRIVATE_STATIC_FIELD;
  }
}

class SubClass extends BaseClassWithPrivateStaticField {}

SubClass.basePublicStaticMethod(); // TypeError: Cannot read private member #PRIVATE_STATIC_FIELD from an object whose class did not declare it

[...]
建议您始终通过类名访问静态私有字段,而不是通过this,这样继承就不会破坏方法。
所以private static 字段不能通过子类访问,这就阻止了在静态方法中使用this这种访问限制的好处是什么?
然而,私有 instance 字段可以通过子类示例访问,这允许在示例方法中使用this

class BaseClassWithPrivateInstanceField {
  #PRIVATE_INSTANCE_FIELD;

  basePublicInstanceMethod() {
    return this.#PRIVATE_INSTANCE_FIELD;
  }
}

class SubClass extends BaseClassWithPrivateInstanceField {}

new SubClass().basePublicInstanceMethod(); // undefined

私有静态方法也不能通过子类访问。所以访问限制实际上适用于所有 * 私有静态成员 *。

w8f9ii69

w8f9ii691#

相反,私有示例字段是继承的
不,它们也不是。私有字段不是原型继承的,访问它们不遵循原型链。
static和instance字段的区别在于,instance字段是由constructor创建的,它是“继承”的,所以它们也默认在子类示例上创建(在super()调用中)。static属性没有等效的功能,当子类extends它时,父类的代码不会运行(并且可以创建私有静态字段)。

相关问题