JavaScript 如何理解 ES 6 的类?

mizuhashi · 发布于 2016年1月20日 · 最后由 tcstory 回复于 2016年10月26日 · 2338 次阅读
23529

class要使用私有变量,居然要包一层闭包,再用一个WeakMap去存?

以前用构造函数的时候好歹var就行了。。 问题是连实例变量都没有,这个class究竟有什么用? 要类变量的话也是妥妥要包一层了

用一个闭包返回一个class。。 我还不如直接用构造函数呢。。。

大家平时用这个class的多吗,涉及到类变量和私有变量是如何去处理的呢?


https://github.com/jeffmo/es-class-fields-and-static-properties 看来babel experimental已经搞出来了

共收到 18 条回复
5173

学ruby的要问这个么?

23529

#1楼 @i5ting 问题是我实在理解不了这个残废的类有什么用。。 类内给我个闭包也好啊

1289

我觉得无视它们省心多了.

4355

歪个楼:

尽量不用 ES6 的 class,在 JavaScript 中尽量不用继承。

5173

#4楼 @lvjian700 前半句对,后半句说的有问题,比如jq里,我不信你不用$.extend

5173

#2楼 @mizuhashi 确实挺残疾的,无视吧

4355

#5楼 @i5ting $.extend 属于深拷贝吧。我把它当 merge 用。

2575

ES 里面有类变量的规范,Babel 等 transpiler 也已经实现了。私有变量是没有的,不过以现在 OO 的影响力,加进去估计只是时间问题了。

但是换个思路想,干嘛一定要用私有变量呢?真担心有代码会改写私有变量么?或者担心队友滥用私有变量?这种事情靠开发者自我约束就能解决。Ruby 和 JavaScript 都属于这类的语言。少了语言约束,但得到了灵活性。

我觉得 ES 给出 class 的写法,不是为了让 JavaScript 更 OO ,而是为了在不改变 prototype 的设计思路的情况下,为批量创建 object 提供一个更 简便统一 的标准(虽然也丧失了一些灵活性)。你看看各种框架里千奇百怪的创建 “类” 的语法就会觉得 ES class 还是有必要的。但这不代表你就一定要用 class 去构造整个应用,class 给了一个选择,但不是唯一的选择。如果你最后真需要了解 class ,可以看看我之前写的 JavaScript 原型系统的变迁,以及 ES6 class

废话了这么多,说说我自己的应用场景,一般情况下我可能直接创建 object ,如果很多 object 需要共同的模板我就会用 class。如果需要标注私有变量,我就用 _xxx 。团队里有明确的约束和 code review 的情况下,一般不需要担心什么。

23529

#8楼 @darkbaby123 谢谢长回复!只是有点把变量包闭包的洁癖,其实问题不大

23529

#10楼 @nightire 我已经掌握了引出nightire大神的正确方法233

assign让人有“这才是js啊”的感觉,相当于mixin又不用去艹原型链,很赞 绑定的问题嘛我觉得我不太会把对象的方法抽出来传,可能还不习惯js的思维

有点下定决心用工厂函数了,很多功能确实是类提供不了,免得以后改写...

2575

@nightire 你为什么不写 post 😄

1573

#12楼 @darkbaby123 主要是看你回答了想补充一点,一开始也没想到会写这么多撒。

1573

#11楼 @mizuhashi 其实我早就看到这帖子了,但是之前并没有想要说点啥……是因为看了后来的一些评论才写的。

把对象的方法抽出来传这件事情并非习惯问题,而是 map() 函数本来就是接受一个一个函数的啊,又不能只把 stepper 对象传给它。在现实中我们经常看到:

[1, 2, 3].map(function(item) {
  stepper.add(item)
})

这样的写法可能会比较贴合大多数人的习惯,然而说句不好听的,这纯属“脱裤子放屁多此一举”……可转念一想也怪不得人家,谁让 JavaScript 的 this 如此不接地气呢?像我上文的那种写法才是本来应该的样子,如果在定义接口的时候能预先考虑 this 绑定的使用场景,那么函数式的“范儿”就会足足的。

2575

@nightire 你这个是真精华

1573

#15楼 @darkbaby123 过奖过奖。

顺便广告一下,Babel 的用户手册和插件开发手册简体中文版已经基本完成,这份文档是我献给 JavaScript 社区的新年礼物,当然要先感谢 Babel Core Team 编写的英文版。

晚些时候我打算写一篇介绍 Flow Syntax 的文章,Babel 的最新版本刚刚支持了它,为 JavaScript 提供了注入类型注解/推导,静态类型检查等特性,从此以后不再是 TypeScript 的专利啦(或者说这是 TypeScript 为 ECMAScript 做出的贡献)。

手册的地址:https://github.com/thejameskyle/babel-handbook/blob/master/translations/zh-Hans/README.md

21380

工厂方法好像不能共享对象方法,要共享方法的话还是只能用构造函数和原型链吧

3ea35f

不错不错, nightire的回答真棒,

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册