【问题标题】:Get Private Method Value at Public Method in JavaScript在 JavaScript 中的公共方法中获取私有方法值
【发布时间】:2021-11-13 09:31:09
【问题描述】:

我创建了一个班级Circle。这里

  1. _radius 是私有参数
  2. _areaCalculate 是私有方法

After 计算私有方法_areaCalculate 的值。我需要这个值到公共方法areaPrint。但它告诉我undefined

const _radius = new WeakMap()
const _areaCalculate = new WeakMap()

class Circle {
    constructor(r) {
        _radius.set(this, r)
    }
    [_areaCalculate]() {
        return (Math.PI * Math.pow(this.radius, 2)).toFixed(2)
    }

    areaPrint() {
        console.log("The area of Circle is: " + _areaCalculate.get(this))
    }
}
let c = new Circle(4)
c.areaPrint()

【问题讨论】:

  • [_areaCalculate]() 不会创建一个名为 _areaCalculate 的方法,它会创建一个名为 "[object WeakMap]" 的方法,因为 _areaCalculate 将被转换为字符串。
  • 话虽如此,您的任何代码都不会在_areaCalculate WeakMap 中添加任何内容。
  • 然后,如何使 _areaCalculate() 成为私有方法并从中获取价值。 @VLAZ
  • _radius_areaCalculate 如何被视为“私有”,它们只是类外部范围内的变量。如果所有这些都在一个函数中,那么你手头就有一个反模式。

标签: javascript instance-variables es6-class private-members


【解决方案1】:

如果坚持使用 OP 的方法,即利用弱映射通过原型方法访问 Circle 实例'“私有成员”,那么只需将代码简化为单个参考地图和一个动态计算圆实例面积的函数......

function getComputedArea(circle) {
  return (Math.PI * Math.pow(rMap.get(circle), 2)).toFixed(2);  
}
const rMap = new WeakMap();

class Circle {
  constructor(radius) {
    rMap.set(this, radius);
  }
  areaPrint() {
    console.log(
      `A radius ${ rMap.get(this) } circle area is ${ getComputedArea(this) }`
    );
  }
}
let a = new Circle(4);
let b = new Circle(9);

a.areaPrint();
b.areaPrint();

... 或者有人遵循 VLAZ 的建议并开始使用 private field declaration syntax 代替 private instance fields

编辑

来自下面与 Bergi 的基于评论的讨论...

“与私有字段不同,私有方法分配在原型上而不是实例上,就像它们各自的公共对应物一样”。 – Bergi

...getComputedArea 的实现从本地辅助函数更改为 private instance method

class Circle {

  #getComputedArea(radius) {
    return (Math.PI * Math.pow(this.#radius, 2)).toFixed(2);
  }
  #radius;

  constructor(radius) {
    this.#radius = radius;
  }
  areaPrint() {
    console.log(
      `A radius ${ this.#radius } circle area is ${ this.#getComputedArea() }`
    );
  }
}
let a = new Circle(4);
let b = new Circle(9);

a.areaPrint();
b.areaPrint();

【讨论】:

  • 在第二个版本中,您还可以将 getComputedArea 设为私有方法
  • @Bergi ...它已经是模块范围内的本地函数。为什么要在只是实用程序/辅助功能的东西上增加复杂性?将其设为私有方法,将在幕后添加另一个弱地图处理(或类似的东西)。
  • 为了一致性和在方法本身中访问this.#radius 的能力,而不是需要参数。我认为它会简化代码,而不是增加复杂性。这是 OP 要求的(即使我个人建议将其设为公共方法)。我怀疑当前引擎中的实现特性会影响该决定。
  • 私有方法与私有字段不同,分配在原型而不是实例上,就像它们各自的公共对应物一样。
  • @Bergi ...好点。我不知道后者。谢谢。我相应地更改了第二个示例代码。
猜你喜欢
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2013-07-27
  • 2013-05-03
  • 2011-12-06
  • 2015-09-13
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多