【问题标题】:What does the `#` symbol do in JavaScript?`#` 符号在 JavaScript 中的作用是什么?
【发布时间】:2020-11-23 13:03:28
【问题描述】:

我遇到了包含# 符号的代码。这有什么用途?代码如下所示:

class someObject{
  #someMethod(){
    //do something 
  }
}

【问题讨论】:

  • @CalvinNunes - 是的,但这个答案并没有回答发布它的人提出的问题。是的,它解决了问题的title,但前提是您完全忽略了问题的text。 :-)(它也很不完整,并且没有解决上面的代码,它使用私有方法,而不是私有字段。)

标签: javascript class private-members


【解决方案1】:

它是一个 sigil(而不是运算符),表示该成员是私有的 - 在本例中为 private method,但它也用于 private fields

您不能在声明它们的类之外的代码中使用私有方法或私有字段。例如:

class Example {
    doSomething() {
        this.#method("from doSomething"); // <== Works
    }
    #method(str) {
        console.log("method called: " + str);
    }
}
const e = new Example();
e.doSomething();
e.#method(); // <=== FAILS

【讨论】:

  • (FWIW,我在第 18 章我的新 [ish] 书 JavaScript: The New Toys 中详细介绍了私有方法和字段。如果你'重新感兴趣。)
  • 谢谢,我去看看
【解决方案2】:

这是一个实验性提案。您可以使用 # 定义私有 JavaScript 方法

更多信息,您可以参考MDN docs

类属性默认是公共的,可以在类外检查或修改。但是有一个 experimental proposal 允许使用哈希 # 前缀定义私有类字段。


您可以使用 ES5 实现类似的功能(只是为了简单说明),您可以在其中模拟私有方法之类的东西(JavaScript 本身没有。)

例如:

function someObj() { //assuming this is a class definition
  function someMethod() { //private method which is not accessible outside someObj

  }

  function init() { //initializes some methods or code, private methods can be used here
    someMethod();
  }

  return {
    init //only exposes the init method outside
  }
}

在上面,它只会暴露来自someObjinit 方法,可以称为someObj.init(),而您的someMethod 将无法在其父方法之外访问。

例子:

someObj.init(); //works
someObj.someMethod(); //won't be accessible

【讨论】:

  • Nit:第 3 阶段的提案不是“实验性的”(请参阅​​ process document)。它们是可能很快就会进入规范的候选提案,在这种情况下可能是今年。
  • @T.J.Crowder 谢谢你的信息。 :) 我希望他们尽快批准该提案。这是 JS 中期待已久的功能:D
  • 谢谢@Mr.Alien
  • 私有方法提案的链接是这个:github.com/tc39/proposal-private-methods。您引用的链接是通用类字段提案。两者都是第 3 阶段。我已经编辑了 MDN 文章中的“实验性”措辞和链接。
【解决方案3】:

hash 用于定义私有类字段

【讨论】:

  • 不在 OP 的问题中。在 OP 的问题中,它定义了一个私有 method
猜你喜欢
  • 2012-07-01
  • 2011-03-20
  • 2011-04-06
  • 2017-09-19
相关资源
最近更新 更多