在 JavaScript 中的公共方法中获取私有方法值

Posted

技术标签:

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

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

    _radius 是私有参数 _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 如何被视为“私有”,它们只是类外部范围内的变量。如果所有这些都在一个函数中,那么你手头就有一个反模式。 Private properties in javascript ES6 classes 【参考方案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 ...好点。我不知道后者。谢谢。我相应地更改了第二个示例代码。

以上是关于在 JavaScript 中的公共方法中获取私有方法值的主要内容,如果未能解决你的问题,请参考以下文章

从 javascript 类中的“私有”方法访问“公共”方法

JavaScript,在公共方法中将私有函数作为字符串调用,而不使用 eval(显示模式)

公共方法中的私有参数

javascript 实例 静态 公共 私有

Python中的公共和私有方法[重复]

如何使用 JUnit 在 Spring Boot 中的公共方法中模拟私有方法