浏览器Javascript类(不是node.js)中私有方法的语法是啥? [复制]

Posted

技术标签:

【中文标题】浏览器Javascript类(不是node.js)中私有方法的语法是啥? [复制]【英文标题】:What is the syntax for private method in browser Javascript class(not node.js)? [duplicate]浏览器Javascript类(不是node.js)中私有方法的语法是什么? [复制] 【发布时间】:2019-02-15 11:36:10 【问题描述】:

我知道这个问题已经被问过很多次了,但是大多数都是针对 Node.js 解决方案的,或者在浏览器中不起作用。

那么,是否可以在浏览器 javascript 类中实现私有方法?

    <html>
    <body>
        <script>
            class Happy
            
                constructor()
                
                
                _leo()
                
                    console.log("ff");
                
                   
            var h=new Happy();
            h._leo();
        </script>
    </body>
</html> 

但是,上面的代码在控制台中仍然输出“ff”,我该如何解决呢?

【问题讨论】:

JavaScript 中没有私有方法。你可以在闭包中隐藏一个函数;您可以在闭包中隐藏方法的键(作为符号);你不能隐藏一个方法(尽管这两种方法都经常用来伪造它)。 有一个stage 3 proposal 添加#someMethod() 语法。 能提供一些例子给我吗? 【参考方案1】:

这说明了如何隐藏方法名称,有效地使方法在隐藏闭包之外无法调用:

const Klass = (function() 
  const privName = Symbol("priv");

  class Klass 
    publ() 
      console.log("in publ");
      this[privName]();
    
    [privName]() 
      console.log("in priv");
    
  

  return Klass;
)()

let inst = new Klass();
inst.publ();
// => in publ
//    in priv

它使用Symbol() 返回一个无法复制的实体这一事实,privName 不会在闭包之外的任何地方公开这一事实,以及我们可以使用方括号表示法定义具有计算名称的属性这一事实。

与ultratoad演示的函数隐藏机制不同,这不仅仅是一个辅助函数,它是一个真正的方法。请注意,您不能使用点表示法来调用它 - 点表示法仅在您知道名称时才有效,而在这里,除了 privName 之外没有人这样做。

【讨论】:

privName 可能无法导出,但您始终可以使用Object.getOwnPropertySymbols(Klass.prototype) 获取符号。它隐藏得很好,不会碰撞,这是巨大的好处,但在技术上它不是私密的。 @loganfsmyth:嗯,不知道。另一方面……嗯。 Ruby 的privatesend 的一个; Pythonista 只是相信其他人会懒得输入下划线。我会接受的。 总而言之,根据您的目标,这种方法将是 100% 可以接受的。

以上是关于浏览器Javascript类(不是node.js)中私有方法的语法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Node.js一学习一

node.js 概念性(什么是node.js)1

Node.js

福利 ▏ Node.JS视频资源

Node.js安装步骤 -- 2019-08-08 18:03:20

Node.js简介