《JavaScript应用程序设计》一一3.2 流式JavaScript
发布日期:2021-08-29 16:14:32 浏览次数:0 分类:技术文章

本节书摘来华章计算机出版社《JavaScript应用程序设计》一书中的第3章,第3.2节,作者:Eric Elliott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 流式JavaScript

我并没有发明一种全新风格的,或综合性的,抑或是修正性的武术体系。我也决不将截拳道
建立成受某些法则控制的区别于“这种风格”或“那种风格”的固定套路。相反,
我希望解放我的同仁们,使他们不再受格斗风格、武术形式和各种主义的奴役。
……真理往往蕴含在简单的动作中。
——李小龙
从其他语言转投JavaScript阵营的程序员可以被看作新进移民,他们总是抱着之前语言的思维模式去解决问题。例如,具有传统面向对象编程经验的程序员在JavaScript中,会把时间浪费在纠结构造函数的使用上,构造函数是面向对象语言时代下的旧产物,在JavaScript中,它会带来时间与效率的损耗。
不幸的是,在现今大多数JavaScript教程中,读者看到的往往是使用构造函数的方式去创建对象。
这种方式有几个弊端,首先,你必须每次以new关键字为前缀去调用构造函数,缺少new关键字会导致构造函数错把this指向全局对象,之后你所有的属性与方法赋值都会对全局对象造成污染,特别是在应用中,一个构造函数常常会实例化多个对象,所以你需要格外小心。不过在严格模式下,情况会稍有不同,缺少关键字new的对象实例化会导致程序抛出异常。
在每个构造函数中逐一对this的指向做检查,可以对此类问题做简单的规避,不过在JavaScript中任何函数都能够返回对象,所以并不是所有对象被创建时都需要new关键字。 使用命名约定可以帮助我们判断哪些场景下需要使用new关键字,一般来说,构造函数的首字母是大写,那么当遇见首字母为大写的函数调用时便使用new关键字。但是这里有一个问题,许多第三方类库的命名空间也是采用这种命名格式,符合命名约定的标识符并不一定就是构造函数,所以这个方案的实际效果并不理想,甚至没有解决根本问题。
真正的问题在于构造函数将迫使你使用传统面向对象编程的思维模式去考虑问题,由于构造函数在某种程度上等同于类,应用还在代码设计时,你可能就开始琢磨,“嗯,我需要一个x类的子类”,接着你便陷入了麻烦中。你忽略了JavaScript中最强大的两个特性:动态对象扩展与原型继承。组合使用这两个特性,能让你在代码复用性与灵活性方面远胜于类继承。
把JavaScript作为编程母语的程序员不会被传统的面向对象思维所束缚,因为他们清楚JavaScript中有更为简洁的原生实现方案。拜读资深JavaScript程序员的代码可以使你受益匪浅。
就像不同的编程语言会有不同的语法特性一样,事实上,在几乎所有学科领域中都会包含不同的流派。武术又分为跆拳道、柔道、搏击、空手道、功夫等流派,每种流派都拥有不同的理念、方法与核心技巧。在《截拳道之道》一书中,李小龙建议每一个习武之人都应该去建立自己的武术套路,学习并掌握不同流派的武技,做到取其精华,去其糟粕,最终形成自己独一无二的武术风格,这便是自由搏击(不同武术流派技艺的最佳结合产物)的核心所在。
编程语言亦然,JavaScript本身就是一个借鉴了包括Scheme(lambda)、Self(原型继承)、Java(语法)等语言特性的融合物。
总地来说,流式风格意味着在编程中丢弃那些低效的构造函数,并最大程度地使用JavaScript本身强大的语言特性。
Lambdas与闭包
作为一种最小的通用程序设计语言, Lambda表达式强大、简单且优雅。理论上来说,任何计算机算法都可以被包装为Lambdas。Lambdas同时也是构成函数式编程的基本要素。
对象字面量
这是构建一个对象实例的最快方法。作为它的兄弟成员,数组字面量也有同样的特性。
动态对象扩展
动态对象扩展让你能够轻松地使用混入、组合、聚合等代码复用模式来对对象进行方法或属性扩充,即使对象已经被实例化。子类继承模式会带来额外的类型判定,它会让代码丧失灵活性且变得更加易碎。

上一篇:NASA 开放巨量 VICAR 源码:近 350 款应用程序
下一篇:《机器人与数字人:基于MATLAB的建模与控制》——2.3节指数映射和k过程