有人用 JavaScript 的# 来创建私有变量么?

2020-07-16 22:33:53 +08:00
 evilStart
#这个语法出来也有一段时间了,但我几乎没有见过有项目里用过?有商业或者大的开源项目用这个方法么?
4329 次点击
所在节点    JavaScript
32 条回复
jiangzhuo
2020-07-16 22:49:48 +08:00
这个你大概得往前穿越个十几年大概有人这么用。
zhuangzhuang1988
2020-07-16 23:08:59 +08:00
不想私有,有时候实在没办法想 hack 一下 js 库,都是私有 咋玩

ps: 以前用过 tinymce, 初始化 3 次必死, 每次都死在 extends 函数上面,
直接用, 幸好这个函数公开出来了, 用 lodash 的 动态替换了下, 就没问题了,
如果真私有了 只能修改代码了
lxk11153
2020-07-16 23:20:14 +08:00
什么语法?来个教程,感谢姐妹
lithbitren
2020-07-16 23:30:59 +08:00
ChanKc
2020-07-16 23:49:14 +08:00
https://github.com/tc39/proposal-class-fields
是个好东西,因为没有私有变量就没有真正意义上的封装。过去要有私有变量只能利用闭包。
不过目前还没正式进入标准,所以没有大项目敢用吧
ChanKc
2020-07-17 00:01:36 +08:00
另一个原因,我说得可能比较得罪人
就是很多前端工程师根本不懂什么叫封装,不懂什么叫 information hiding
no1xsyzy
2020-07-17 00:33:18 +08:00
@ChanKc #5 俺寻思就是没闭包没对象的时候也有真正意义上的封装啊
@zhuangzhuang1988 #2 跑个题,这个特定情况应该提 bug 给上游吧……
zhuangzhuang1988
2020-07-17 01:32:46 +08:00
@no1xsyzy 不知道何年马月
hronro
2020-07-17 01:38:26 +08:00
@ChanKc stage 3 了,基本上等于进了标准。大项目的话,我知道 deno 在用。
mxT52CRuqR6o5
2020-07-17 01:41:38 +08:00
deno 里有用到
而且这个 feature 有些见仁见智的问题(可以上知乎上查查)
seki
2020-07-17 02:33:46 +08:00
可以问一下自己是不是真的有私有变量的需求,为什么会想要设置私有变量,用了之后会不会有哪些不便之处

这些都思考了之后还是觉得有必要的话那就用吧
seki
2020-07-17 02:51:54 +08:00
个人的看法,给没有静态类型检查的语言引入私有变量,就是给运行时埋雷,以前要好多行代码埋的雷,现在只需一个 #
ChanKc
2020-07-17 08:19:46 +08:00
@no1xsyzy 还真有人出来挑战
来说说什么是封装
love
2020-07-17 09:40:43 +08:00
@seki 什么叫是不是真的有私有变量的需求,难道你写的类全是公开成员? 总是要区别一下私有变量的,以前用下划线,现在换成#不是一样?还自动多了强制不可外部访问功能不好吗。 另外这个和静态类型检查有冲突吗?
no1xsyzy
2020-07-17 10:23:41 +08:00
@ChanKc #13 将加工完成的半导体元件加上导线及外壳以利使用及保护
或者整个分子被包裹进另一个更大的分子
引申到软件工程是指使得一段代码仅仅暴露少量接口,以减少耦合性;或者说用某种方式把代码的边界给隔离开来。
所以所有程序内存隔离,仅以 stdin stdout stderr 进行交互是一种封装。
ChanKc
2020-07-17 10:54:57 +08:00
@no1xsyzy 有趣的解释
阅读 https://github.com/tc39/proposal-class-fields/blob/master/PRIVATE_SYNTAX_FAQ.md#why-is-encapsulation-a-goal-of-this-proposal
“While it's already possible to model true encapsulation using either per-instance closures or WeakMaps”
这里的 true encapsulation 是指什么?
seki
2020-07-17 11:14:54 +08:00
@love
如果用下划线这种,那是开发者之间的约定,用 # 就是强制性的。包括 typescript 的 private 也是用于检查,不是 # 这样的强制

如果你在代码里面引用了其它对象的私有变量,静态类型检查可以提醒你不要这么做。但是没有这种检查的话,那就直接等运行时爆炸了

真的有不少语言没有私有变量的需求,基本依靠开发者的自觉,比如 ruby 和 python
no1xsyzy
2020-07-17 11:19:51 +08:00
@ChanKc #16 我也不知道指的什么,information hiding 又不是 encapsulation 的目标,而是手段。
强行说 true 不 true 有点 cult 意思在。
ChanKc
2020-07-17 11:41:53 +08:00
@seki 我想写的时候你就知道哪些是私有的啊,不是都有#开头?不去拿#开头的变量不就没问题了?
Austaras
2020-07-17 14:36:08 +08:00
我直说吧,要 hard private 都是弱智,你像隔壁 python 一样搞搞 name convention 差不多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690736

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX