JavaScript 如何理解 ES 6 的类?

mizuhashi · 2016年01月20日 · 最后由 tcstory 回复于 2016年10月26日 · 4982 次阅读

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

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

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

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


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

学 ruby 的要问这个么?

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

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

歪个楼:

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

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

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

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

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 的情况下,一般不需要担心什么。

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

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

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

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

@nightire 你为什么不写 post 😄

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

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

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

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

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

#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

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

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

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