You Don't Know JS - 你不知道的JavaScript(上卷)
图书信息
英文书名:You Don't Know JS: Scope & Closures & This & Object & Protoypes
中文书名:你不知道的 JavaScript(上卷)
作者:[美] Kyle Simpson
译者:赵望野 / 梁杰
页数:正文 188 页 / 附录 7 页
英文出版社:O'Reilly Media
中文出版社:人民邮电出版社 / 图灵教育
出版日期:英文原版 2014 / 简体中文版 2015
个人分类:前端 / JavaScript
ISBN:978-7-115-38573-4
书评
写于2022年4月1日。
本书并不厚,不到两百页的篇幅使其阅读起来并不会有什么压力。虽然出版于2014年,但是勉强赶上了ES6时代,因此也不算太过时。
书的内容在副标题中写得很清楚了“Scope & Closures & This & Object & Protoypes”,翻译过来就是“作用域、闭包、This、对象以及原型”,而这些基本就是JS中最令人困惑的那些特性了(ES6出现之前,现在得把Promise和Proxy这些加上)。
《你不知道的JavaScript(上卷)》实际上是两本书的合集。第一部分讲词法作用域和闭包,很有趣,也带人了解了解释器是怎样工作的,讲闭包那部分也很有用(虽然对我好像没什么帮助)。不过第一部分用很大的篇幅分析了var造成的诸多迷惑特性,这个倒确实过时了,我想不出有任何理由在现代JS代码里使用var。当然,了解历史终归是有点帮助的,不过意义不是很大就是了。
第二部分就有些神奇了,除开我本来就很清楚的原型链,其关于this和继承模式的讲解可谓是醍醐灌顶,最大的收获应当是对this的动态绑定有了一个比较清楚的认识。this的确是一个很让人困惑的特性,但它同时也是许多库之所以能够实现很多魔法的原因,而this的存在造就了JS无与伦比的动态性。JS最关键的是不要把Java等传统面向对象语言的类继承思想带到JS,而是要抛弃“类继承”,转而以对象和连接去思考。
作者在书中对“类继承”进行了抨击,指出在JS中使用类继承是很愚蠢的行为。于是作者提出了“OLOO”模式,试图以委托代替继承。OLOO模式看起来是很好的,也很符合原型继承思想,更契合JS的本质。然而按照我个人的见解,这似乎没有解决本质上的问题,而且确确实实导致代码变得更繁琐了,我很难想象在存在new关键字的情况有什么不使用new的理由。另外OLOO本质上就是另一种混入,严重降低了代码的内聚性,很多时候这并不是一个好主意。
作者在写作的时候估计也没想到class在这些年里确确实实地使难以计数的项目收益。而且随着TC39委员会的持续推进,JS的class正变得越来越接近于真正的“类”。事实上,现在将class称作是一个“语法糖”并不妥当。class目前的实现机制已经变得非常复杂,几乎完全屏蔽了对prototype的操作,在静态方法、类属性和私有属性/方法加入后(ES2022)已经和大多数主流语言中的class没什么区别了。class的确惠及了太多人,似乎已经没有反对class的理由了。当然,如果当时另辟蹊径选择尝试另一种更加JS的方式实现更好的面向对象,也许会更好。
除开由于出版年份较早而带来的一部分内容稍微过时的问题,和作者本人的一些偏见,整本书综合来看是非常值得称道的。尤其是关于this这一JavaScript中让很多人头疼的黑魔法,本书讲得颇为透彻。我是建议每一个前端从业者都阅读一下这本书的,后面的中卷和下卷不谈(说实话中卷就比较一般了,而下卷比较烂),至少上卷是一定要读一读的,本身两百页不到的书也花不了几天就能读完。
最后更新于