`

JavaScript 有多灵活?

 
阅读更多

JavaScript 有多灵活?

Posted: 09 Feb 2015 10:53 PM PST

JavaScript 是一种灵活的语言,表达力极强,我来举一个例子,保证让很多人大吃一惊。

本文受到了 Kyle Simpson 的文章《Iterating ES6 Numbers》的启发。

首先,在 Number.prototype 对象上,部署一个 add 方法。


Number.prototype.add = function (x) {
  return this + x;
};

上面代码为 Number 的实例定义了一个 add 方法。(如果你对这种写法不熟悉,建议先阅读我写的《JavaScript 面向对象编程》。)

由于 Number 的实例就是数值,在数值上调用某个方法,数值会自动转为实例对象,所以就得到了下面的结果。


8['add'](2)
// 10

上面代码中,调用方法之所以写成8['add'],而不是8.add,是因为数值后面的点,会被解释为小数点,而不是点运算符。

将数值放在圆括号中,就可以使用点运算符调用方法了。


(8).add(2)
// 10

其实,还有另一种写法。


8..add(2)
// 10

上面代码的第一个点解释为小数点,第二个点解释为点运算符。为了语义清晰起见,下面我统一采用圆括号的写法。

由于add方法返回的还是数值,所以可以链式运算。


Number.prototype.subtract = function (x) {
  return this - x;
};

(8).add(2).subtract(4)
// 6

上面代码在Number对象的实例上部署了subtract方法,它可以与add方法链式调用。

如果使用方括号调用属性,写法会很古怪。


8["add"](2)["subtract"](4)
// 6

我们还可以部署更复杂的方法。


Number.prototype.iterate = function () {
  var result = [];
  for (var i = 0; i <= this; i++) {
    result.push(i);
  }
  return result;
};

(8).iterate()
// [0, 1, 2, 3, 4, 5, 6, 7, 8]

上面代码在 Number 对象的原型上部署了 iterate 方法,可以将一个数值自动扩展为一个数组。

总之,现在我们可以在数值上直接调用方法了,但是后面一对圆括号看着有点碍眼,有没有可能去掉圆括号呢?也就是说,能不能将下面的表达式


(8).double().square()

写成另一种样子?


(8).double.suqare

这是可以做到的。

ES5规定,每个对象的属性都有一个取值方法get,用来自定义该属性的读取操作。


Number.prototype = Object.defineProperty(
  Number.prototype, "double", {
    get: function (){return (this + this)} 
  }
);

Number.prototype =  Object.defineProperty(
  Number.prototype, "square", {
    get: function (){return (this * this)} 
  }
);

上面代码在 Number.prototype 上定义了两个属性 double 和 square ,以及它们的取值方法 get 。

因此,在任一数值上,读取这两个属性,就可以写成下面的样子。


(8).double.square
// 256

也可以改用方括号运算符。


8["double"]["square"]
// 256

(完)

分享到:
评论

相关推荐

    Angular和Javascript有什么关系?

    JavaScript为Angular提供了运行的基础,而Angular则利用JavaScript的灵活性和广泛接受度,结合TypeScript的强类型和面向对象特性,提供了一种现代的、高效的Web应用开发解决方案。无论是JavaScript开发者还是...

    最流行的编程语言JavaScript能做什么? - OPEN 开发经验库1

    综上所述,JavaScript以其灵活性和广泛的支持库,成为了现代软件开发中的多面手,无论是在传统的网页开发,还是新兴的领域如移动应用、服务端、桌面应用、游戏、VR/AR、物联网,甚至是操作系统界面,都有其身影。...

    JavaScript语言案例.zip

    此外,它支持多种编程范式,包括面向对象、函数式以及声明式编程,为开发者提供了极大的灵活性。 1. **变量与数据类型**:JavaScript是弱类型语言,变量可以动态地改变其数据类型。它有七种基本数据类型,包括...

    JavaScript继承

    此外,JavaScript的灵活性允许开发者选择基于类的继承方式,或者利用原型继承的微妙之处,实现更高效的设计。 4.1 为什么需要继承 继承的主要目的是代码复用和降低耦合度。通过继承,可以在已有类的基础上扩展功能...

    ??????????_javascript_

    JavaScript的灵活性和丰富的库资源使其成为构建物联网解决方案的理想选择。 7. 数据交换:在JavaScript和Arduino之间,数据可以通过串行通信进行交换。JavaScript可以接收来自Arduino的传感器数据,处理后再发送...

    JavaScript设计模式+JavaScript模式+JavaScript异步编程

    - 工厂模式:创建对象时避免使用new操作符,提供更灵活的实例化过程。 - 观察者模式:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - 代理模式:为...

    《JavaScript》课程标准

    通过这门课程的学习,使学生对 JavaScript 有一个全面的了解,掌握相关的知识点,在软件设计中能灵活地运用 JavaScript 进行系统开发。职业能力目标:培养学生编写规范化的程序代码,自主的学习能力,良好的与人沟通...

    JavaScript权威指南(JavaScript犀牛书一本)

    2. **对象和原型**:深入探讨了JavaScript的面向对象特性,包括对象字面量、构造函数、原型链、继承机制等,这是理解JavaScript灵活性的关键。 3. **作用域和闭包**:解析了JavaScript中的变量作用域规则以及闭包的...

    ArcGis-for-javaScript最全中文API.pdf

    本文将对 ArcGIS JavaScript API 进行详细的介绍,并提供多个示例来帮助读者快速上手。 一、ArcGIS JavaScript API 概述 ArcGIS JavaScript API 是一个基于 JavaScript 的开发工具,允许开发者创建交互式的 Web ...

    Head First Javascript源码

    在JavaScript的世界里,源码分析尤其关键,因为JavaScript是动态类型语言,其灵活性和动态特性使得理解和调试代码更加复杂。 首先,我们需要了解JavaScript的基础知识。JavaScript是一种解释型、基于原型的脚本语言...

    JavaScript资源大全中文版

    这份资源大全包括了多个关键领域的内容,如包管理器、加载器、测试框架、运行器、质量保证(QA)工具、MVC框架和库以及模板引擎等。 首先,包管理器是现代JavaScript开发的关键工具,它们简化了依赖管理和项目构建...

    悟透JavaScript悟透JavaScript悟透JavaScript悟透JavaScript

    - **灵活性**:由于函数在JavaScript中被视为第一类公民,因此可以非常灵活地使用函数来实现各种复杂的逻辑和设计模式。 #### 六、回归简单——JavaScript的核心理念 要真正理解JavaScript,需要抛开复杂的面向...

    JavaScript小技巧全集 JavaScript教程 JavaScript源代码集

    这种灵活性使得JavaScript易于上手,但也可能导致一些类型相关的错误,需要开发者有清晰的理解和谨慎的处理。 在JavaScript中,函数是一等公民,可以作为值传递,也可以作为返回值。例如,创建一个简单的函数: ```...

    JavaScript手册 JavaScript手册

    对象可以通过引用来传递,而不是复制,这种特性使得对象在JavaScript中非常灵活。对象的原型链是JavaScript继承的核心机制,通过__proto__属性或Object.getPrototypeOf方法可以访问原型。 数组是有序的数据集合,...

    javascript函数式编程

    这种编程风格在JavaScript中尤其常见,因为它提供了高度的灵活性和强大的功能。 在JavaScript中,函数式编程的核心概念包括: 1. **纯函数**:纯函数是指给定相同的输入,始终返回相同输出,并且不产生任何副作用...

    javaScript api

    这个离线的JavaScript API CHM文件是一个宝贵的开发资源,它包含了大量的函数、方法、对象和类的详细文档,对于深入理解JavaScript的工作原理、提高开发效率非常有帮助。开发者可以在没有网络连接的情况下,快速查找...

    javascript中文手册 javascript中文手册

    此外,JavaScript还支持原型继承和闭包,这些高级特性让代码更加灵活和强大。 JavaScript与DOM(Document Object Model)紧密相连,允许开发者通过JavaScript操作网页的HTML元素,实现动态更新页面内容、响应用户...

    javascript

    JavaScript作为Web前端开发的核心技术之一,其灵活多变的语法和强大的功能使其成为开发者必须掌握的语言之一。了解和熟练运用JavaScript的不同知识点,可以大大提升开发效率,丰富网页功能,改善用户体验。在实际...

    org.mozilla.javascript-1.7.2.jar

    使用"org.mozilla.javascript-1.7.2.jar",开发者可以方便地在Java应用程序中嵌入JavaScript代码,实现动态行为或者提供灵活的配置。例如,在Web应用中,可以使用Rhino引擎来解析用户输入的JavaScript代码,进行安全...

Global site tag (gtag.js) - Google Analytics