D3.js中的函数式编程

154 阅读1分钟

函数式编程是一个复杂的话题,本文仅从getter/setter方法和链式调用两个方面,介绍D3.js源码中的一些函数式编程思想。

先看一段代码

function ExampleWidget (style) {
    const instance = {};
    let title;
    instance.render = function () {
        const header = document.createElement("h1");
        header.innerText = title;
        document.body.appendChild(header);
        return instance;
    }
    instance.title = function (t) {
        if (arguments.length) {
            title = t;
            return instance;
        }
        else return title;
    }
    return instance;
}

const widget = ExampleWidget();

// setting
widget.title('D3 Functional-Programming');

// getting
console.log(widget.title());

// method chaining (链式调用)
widget.title('D3 Functional-Programming').render();

getter/setter方法

先说用法,当我们调用widget.title()的时候,我们调用的是getter,当我们调用widget.title('D3 Functional-Programming')的时候,我们调用的是setter。

那么D3是怎样实现这样的方法的呢?

在第10-17行这段代码中,函数通过判断有无参数来确定当前是getting还是setting。当参数个数为0的时候,D3认为这是一个getting,所以它把title的值返回回去。当参数的个数不为0的时候,D3认为这是一个setting,所以它把参数的值赋给内部变量title。

链式调用

我们在实例代码的第28行,完成了一个链式调用,连续调用了title('D3 Functional-Programming')render()两个方法。

实现这样的链式调用非常简单,只需要在函数实现的最后一行,return当前实例就可以了。(第8行、第13行)

实例的可执行代码:github.com/dongqiaogon…