|  |      1jiangzhuo      2020-07-16 22:49:48 +08:00 这个你大概得往前穿越个十几年大概有人这么用。 | 
|  |      2zhuangzhuang1988      2020-07-16 23:08:59 +08:00 不想私有,有时候实在没办法想 hack 一下 js 库,都是私有 咋玩 ps: 以前用过 tinymce, 初始化 3 次必死, 每次都死在 extends 函数上面, 直接用, 幸好这个函数公开出来了, 用 lodash 的 动态替换了下, 就没问题了, 如果真私有了 只能修改代码了 | 
|  |      3lxk11153      2020-07-16 23:20:14 +08:00 什么语法?来个教程,感谢姐妹 | 
|  |      4lithbitren      2020-07-16 23:30:59 +08:00 | 
|      5ChanKc      2020-07-16 23:49:14 +08:00 https://github.com/tc39/proposal-class-fields 是个好东西,因为没有私有变量就没有真正意义上的封装。过去要有私有变量只能利用闭包。 不过目前还没正式进入标准,所以没有大项目敢用吧 | 
|      6ChanKc      2020-07-17 00:01:36 +08:00 另一个原因,我说得可能比较得罪人 就是很多前端工程师根本不懂什么叫封装,不懂什么叫 information hiding | 
|  |      7no1xsyzy      2020-07-17 00:33:18 +08:00 | 
|  |      8zhuangzhuang1988      2020-07-17 01:32:46 +08:00 @no1xsyzy 不知道何年马月 | 
|      10mxT52CRuqR6o5      2020-07-17 01:41:38 +08:00 via Android deno 里有用到 而且这个 feature 有些见仁见智的问题(可以上知乎上查查) | 
|  |      11seki      2020-07-17 02:33:46 +08:00 via iPhone 可以问一下自己是不是真的有私有变量的需求,为什么会想要设置私有变量,用了之后会不会有哪些不便之处 这些都思考了之后还是觉得有必要的话那就用吧 | 
|  |      12seki      2020-07-17 02:51:54 +08:00 via iPhone  2 个人的看法,给没有静态类型检查的语言引入私有变量,就是给运行时埋雷,以前要好多行代码埋的雷,现在只需一个 # | 
|  |      14love      2020-07-17 09:40:43 +08:00 @seki 什么叫是不是真的有私有变量的需求,难道你写的类全是公开成员? 总是要区别一下私有变量的,以前用下划线,现在换成#不是一样?还自动多了强制不可外部访问功能不好吗。 另外这个和静态类型检查有冲突吗? | 
|  |      15no1xsyzy      2020-07-17 10:23:41 +08:00  1 @ChanKc #13 将加工完成的半导体元件加上导线及外壳以利使用及保护 或者整个分子被包裹进另一个更大的分子 引申到软件工程是指使得一段代码仅仅暴露少量接口,以减少耦合性;或者说用某种方式把代码的边界给隔离开来。 所以所有程序内存隔离,仅以 stdin stdout stderr 进行交互是一种封装。 | 
|      16ChanKc      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 是指什么? | 
|  |      17seki      2020-07-17 11:14:54 +08:00 @love  如果用下划线这种,那是开发者之间的约定,用 # 就是强制性的。包括 typescript 的 private 也是用于检查,不是 # 这样的强制 如果你在代码里面引用了其它对象的私有变量,静态类型检查可以提醒你不要这么做。但是没有这种检查的话,那就直接等运行时爆炸了 真的有不少语言没有私有变量的需求,基本依靠开发者的自觉,比如 ruby 和 python | 
|  |      18no1xsyzy      2020-07-17 11:19:51 +08:00 @ChanKc #16 我也不知道指的什么,information hiding 又不是 encapsulation 的目标,而是手段。 强行说 true 不 true 有点 cult 意思在。 | 
|      20Austaras      2020-07-17 14:36:08 +08:00  1 我直说吧,要 hard private 都是弱智,你像隔壁 python 一样搞搞 name convention 差不多了 | 
|  |      21rioshikelong121      2020-07-17 14:39:47 +08:00 没有 直接 ts private 。 | 
|  |      22gaoryrt      2020-07-17 15:08:05 +08:00 根本不懂什么叫封装也可以写好前端。 浏览器环境的话,可以,但没有必要。 | 
|  |      23libook      2020-07-17 15:42:59 +08:00 我们在用,不过确实用得不多,主要是因为将成员私有化这个需求本身就比较少出现,而且利用局部变量往往也可以达到私有化的效果(比如闭包)。 这个就是个特性而已,没有需求就不用,有需求能想起来用就行。 | 
|      24optional      2020-07-17 15:50:59 +08:00 @ChanKc 封装这大概率是 oo 的说法,js 根本不是纯粹的 oo 语言。  作为一门业务型语音,比较认同上面 Austaras 说的,hard private 是个弱智,依赖这玩意的说明你根本不相信你的队友。 | 
|  |      25yaphets666      2020-07-17 15:52:15 +08:00 js 现在需要的是语法糖 不需要任何新的概念性的东西了 | 
|  |      26MrTreasure      2020-07-17 17:30:28 +08:00 没有使用的场景。 前端无非就是 Vue React NG,NG 就不说了,没有几个人用 NG 不用 TS 吧。用 Vue 和 React 的大概率也用不到封装。 那么用到的封装的,大部分是需要写库,写 SDK 的。这些场景大概率会选择 TS 。 | 
|      27ChanKc      2020-07-17 18:33:20 +08:00 @optional 不是不相信我的队友,就如#26 所说,一般都是写库和写 SDK 的需要。还有一种情况可能是跨团队。 封装就是暴露接口,隐藏实现。暴露和隐藏都是关键。暴露的接口可以认为是有保证的,一定会出现预期的(和文档描述一致的)结果。在这个基础上,所有隐藏的部分,无论是方法还是域都可以随便改随便重构。 hard private 的好处是可以保证你的 API 的使用者的程序一定不会因为你的重构,升级和优化等等而受到破坏。当然如果所有 API 的使用者都遵循 naming convention,这些 API 的使用者也可以受到封装带来的好处。 封装的主要受益人是 API 使用者,但是却是 API 的开发者来写的。如果库,SDK 的开发者根本不在乎他的用户的长期的使用体验,可以不用封装。 #22 说的情况是,过去很长时间里,前端的库不多,在浏览器运行的代码也不多,很多时候用户都是自己调自己的方法,这时候可能就是“跑起来就行” 还有一种情况是,很多程序在开始建项目的时候确定了一个版本,后来就没再升级过,这个时候就可以像#2 那样随便 hack | 
|  |      28wobuhuicode      2020-07-17 18:39:31 +08:00 约定命名作为私有也就够了。比如说下划线命名的就是私有之类的。 放在其它语言你搞个 SDK 出来,人家照样能在 runtime 读取你的私有变量。不也是一个打破约定的事情嘛。 所以私有公有无非就是大家都要去遵守的约定才有效。 | 
|  |      29Yuiham      2020-07-17 19:10:45 +08:00 这个 proposal 一堆问题,最好不要进入 ES 标准了。大部分时候 Symbol 足够用了。 | 
|      30optional      2020-07-17 19:11:59 +08:00 @ChanKc 这一套道理谁都明白。,但是业务型语言就是业务型语言,你看新出的语言,限制都在弱化,或者说都在践行『约定大于配置』,用大小写控制可见性,ducktype 替代 interface 。 hard private 真的是你需要的吗? | 
|  |      32chnwillliu      2020-07-19 20:23:24 +08:00 via Android 搭配 ES6 的 Proxy 一起食用那叫一个酸爽,保准泪流满面哭着喊苍天啊这都什么鬼 feature 啊 https://github.com/tc39/proposal-class-fields/issues/106   有兴趣可以看看这个 issue |