【问题标题】:How to access the super-class's private member in JavaScript?如何在 JavaScript 中访问超类的私有成员?
【发布时间】:2019-04-26 10:13:36
【问题描述】:

class 中,我如何访问其基类的私有字段,比如#property

class Base {
  #property = '1.618'
  toString() {
    return Base.name
  }
}
class X extends Base {
  thisWorks() {
    return super.toString()
  }
  toString() {
    return super.#property // SyntaxError: Unexpected private field
  }
}
console.log(`${new X}`)

【问题讨论】:

  • 我认为这是不可能的。从面向对象的角度来看,它需要受到保护或公开才能访问。
  • 仅供参考,受保护的成员访问是可行的,我实际上做过一次实验,但它非常笨拙并且性能受到影响。基本上是一个用于构建一个类的包装器,该类在原型对象上提供函数和属性,然后对其进行弱映射并针对每个方法名称的 getter 中的 function.caller 进行检查,但是 function.caller 现在已被弃用,看起来不会有替代品

标签: javascript oop private superclass ecmascript-next


【解决方案1】:

在 OOP 中,即使扩展,您也无法访问类外部的 private 方法或属性。但是你可以在子类中访问父类的protected方法。

【讨论】:

  • 是的,但是这个问题是关于JavaScript中的#-properties,它没有protected#只是随便称为“私有”
  • 好吧,据我所知,您无法在 JavaScript 中拥有受保护的方法或属性。但是您可以简单地在 Identifiers 前面添加 '_' 符号以将其标识为私有,但仍然可以在课堂外访问。
【解决方案2】:

impossible:

这意味着私有字段纯粹是内部的:除非类选择揭示它们。 (这包括子类和超类。)

Base 将不得不以其他方式故意暴露其#property,例如通过方法。

【讨论】:

  • 我明白了。为什么要这样设计,特别是为什么要排除子类?
  • 我很确定这是为了封装,请参阅here - 每个类都可以有自己的私有属性,即使与超类上的私有属性同名,也不会发生冲突。
  • 有趣,谢谢。确实没有冲突,但登录到控制台看起来有些奇怪:{#property: 1, #property: 2}。但是我可以看到这如何阻止通过“蛮力”发现类的私有属性的名称
猜你喜欢
  • 2013-01-09
  • 2013-03-10
  • 2016-09-06
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多