浏览器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 的private
是send
的一个; Pythonista 只是相信其他人会懒得输入下划线。我会接受的。
总而言之,根据您的目标,这种方法将是 100% 可以接受的。以上是关于浏览器Javascript类(不是node.js)中私有方法的语法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章