【问题标题】: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(){} 语法。
  • 能提供一些例子给我吗?

标签: javascript browser ecmascript-6


【解决方案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 的private 是send 的一个; Pythonista 只是相信其他人会懒得输入下划线。我会接受的。
  • 总而言之,根据您的目标,这种方法将是 100% 可以接受的。
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 2015-10-17
  • 1970-01-01
  • 2017-11-09
  • 2011-01-16
  • 2020-09-07
  • 2016-03-19
  • 2019-06-28
相关资源
最近更新 更多