来自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
私有静态方法也不能通过子类访问。所以访问限制实际上适用于所有 * 私有静态成员 *。
1条答案
按热度按时间w8f9ii691#
相反,私有示例字段是继承的
不,它们也不是。私有字段不是原型继承的,访问它们不遵循原型链。
static和instance字段的区别在于,instance字段是由
constructor
创建的,它是“继承”的,所以它们也默认在子类示例上创建(在super()
调用中)。static属性没有等效的功能,当子类extends
它时,父类的代码不会运行(并且可以创建私有静态字段)。