JavaScript语言多编程范式简介

techbrood 发表于 2017-01-04 18:58:03

标签: javascript, 基础知识, 编程

- +

和C++等语言类似,JS支持多范式(paradigms)编程。我们常常混合这些范式来完成一些大型Web项目。

JS支持3种编程范式:命令式、面向对象和函数式。

命令式(Imperative JavaScript)

命令式就是简单的从上而下完成任务,流水账过程式编码风格:

function task(nums) {
	var i, sum=0, squares = [];

	for (i=0; i<nums.length; i++) {
		squares.push(nums[i]*nums[i]);
	}

	for (i=0; i<squares.length; i++) {
		sum += squares[i];
	}

	return sum;
}

console.log(task([2,4,6])); // 56

这样编写代码比较简单,但是存在一些明显的问题,比如可能的命名冲突、变量冗余,复用性差、函数名描述性差等。

面向对象(Object-Oriented JavaScript)

面向对象的核心思想是把任务抽象成一个(或一组)对象的数据和操作,在C++语言中,这些抽象出来的对象可以便于接口或实现的复用(继承)以及访问控制,在JS中由于没有接口的概念,只能是函数实现的复用。

(function() {
  "use strict";
  var Task = function(nums) {
    this.nums = nums;
  };

  Task.prototype.square = function() {
    var squares = [];
    for (var i=0; i<this.nums.length; i++) {
        squares.push(this.nums[i]*this.nums[i]);
    }
    return squares;
  };
  Task.prototype.sum = function(arr) {
    var res = 0;
    for (var i=0; i<arr.length; i++) {
        res += arr[i];
    }
    return res;
  };

  var t = new Task([2,4,6]);
  console.log(t.sum(t.square())); //56
}()); // self call with brackets

上面的代码创建了一个Task对象,包含公开属性nums,并通过原型定义了2个方法:square和sum,可以在多个对象之间共享,这样将节约内存。另外代码被包含在一个IIAF(immediately-invoked function expression)中,而不再是全局的。除了更符合OO的思维方式外,似乎代码并没有变得更为简洁。

函数式(Functional JavaScript)

const task = (nums) => nums.map( (x) => x * x ).reduce( (acc, c) => acc + c, 0);
console.log(task([2, 4, 6])); //56

可以看到,通过数组对象的内置原型方法map和reduce,大大简化了代码,并且如果熟悉了这种风格,其代码的自描述性也很棒。

map和reduce都是高阶函数(能接受函数作为参数,也能返回函数对象)。map函数用来把一组数据依次变换成另外一组数据,而reduce用来汇总数据,下图是对这两个关键函数有趣而直白的描述:

what-is-map-reduce.png

小结一下:命令式编程是最基础的方式,面向对象的方式适合对现实世界进行抽象封装以及实现访问控制,函数式能最大程度的精简代码且适用于并行计算,而纯净函数(pure function)具有很好的移植性。

你可以自己在线试试看

possitive(13) views12642 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章