在JavaScript类中,`#`符号(井号)有什么作用?

5
我遇到了包含“#”符号的代码。它是用于什么的?该代码看起来像这样:
class someObject{
  #someMethod(){
    //do something 
  }
}

1
@CalvinNunes - 是的,但那个答案并没有回答发帖者提出的问题。是的,它解决了问题的标题,但只有当你完全忽略问题的文本时才能这样做。 :-) (它也非常不完整,并且没有涉及上面使用私有方法而不是私有字段的代码。) - T.J. Crowder
3个回答

10

这是一个符号(而不是操作符),代表该成员是私有的 - 在这种情况下,是一个私有方法,但它也用于私有字段

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

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

(顺便说一句,如果你感兴趣的话,我在我的新书《JavaScript:新玩具》的第18章中详细介绍了私有方法和字段。链接在我的个人资料中。) - T.J. Crowder
谢谢,我会去查看的。 - Ran Marciano

4

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

了解更多信息,您可以参考MDN文档

类属性默认为公共属性,可以在类外部检查或修改。然而,有一个实验性提案,允许使用哈希#前缀定义私有类字段。


您可以通过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

注意:第三阶段的提案不是“实验性的”(请参见流程文档)。它们是候选提案,很可能会在不久的将来进入规范,本例中可能是今年。 - T.J. Crowder
1
@T.J.Crowder 谢谢你提供的信息。 :) 我希望他们能尽快批准这个提案。这是 JS 中期待已久的功能 :D - Mr. Alien
1
谢谢@Mr.Alien - Ran Marciano
私有方法提案的链接是这个:https://github.com/tc39/proposal-private-methods。你引用的链接是关于一般类字段提案的。两者都处于第三阶段。我已经编辑了MDN文章中的“实验性”措辞和链接。 - Sebastian Simon

-2

哈希用于定义私有类字段


2
在OP的问题中,它定义了一个私有的方法 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接