元程序设计之 Proxy(代理)

本章将解释 ECMAScript 6 特性代理。代理使你能够拦截和自定义对对象执行的操作(例如获取属性)。 他们是一个元程序设计特征。

今天我们来不一样的讲法吧,我们开篇就告诉大家 Proxy 的写法:

let proxy = new Proxy(target, handler);

Proxy 对象的所有用法,都是上面这种形式,不同的只是 handler 参数的写法。其中,new Proxy( ) 表示生成一个 Proxy 实例,target 参数表示所要拦截的目标对象,handler 参数也是一个对象,用来定制拦截行为。**

当然啦,如果我们接着讲下去,大家可能会觉得奇怪。因此在继续讲 Proxy 之前,我们先将元编程这个概念介绍下。

在一般的编程中,有两种级别:

  • 一是基本级别(base level),也叫程序应用级别。代码的执行都是通过我们的输入进行的。
  • 二是元级别(meta level),这里执行的是基本级别的代码。

相信你会觉得有点蒙,没事,我们来个例子吧:

// Base level
let obj = {
    hello() {
        console.log('Hello!');
    }
}; 

// Meta level
for (let key of Object.keys(obj)) {
    console.log(key);
} 

看出点端倪来没有?没错,基本级别就是说我们输入什么,它就输出什么;而元级别是在语言的内部根据相应的算法执行操作后,再输出相关结果。我们可以将 Object.*method 的方法都可以称作是元编程。

let target = {};
let handler = {
    // 拦截: getting 属性
    get(target, propKey, receiver) {
        console.log(`GET ${propKey}`);
        return 123;
    },
    // 拦截:确认属性是否存在
    has(target, propKey) {
        console.log(`HAS ${propKey}`);
        return true;
    }
};
let proxy = new Proxy(target, handler);
proxy.foo;  // GET foo
'Hello' in proxy;  // HAS Hello

相信你可能没有理解,没事,我一句一句讲:首先 target 这个参数是我们要拦截的对象,我们输入了 {},也就是说,Object 这个类型上的方法都会被修改;handler 这个参数里就是我们定义的方法,也就是我们想要改变的方法;最后我们创建了一个实例,这个实例继承了我们定义的原型的方法;proxy.foo 的输出结果相信大家也看见,也就是说,我们可以随意的写什么,只要满足我们定义的 proxy 内的方法,就会返回我们自定义的方法的输出结果。

这里有一些方法是我们可以改变为自定义的,但是如果我们没有改变它,那么它将保持原来的算法。具体的方法我这里就不一一列举了。

你可以去 MDN:Proxy 这一章的左侧找到相应的方法。

你肯定会好奇我为什么不讲呢?说实话,即便是我讲了,你也不见得用得上这个 Proxy。这个代理最大的作用是自定义基本的方法,也就是说,更多的不用于我们平时的工作中。

本节更多的目的是做一个科普,让你有一个印象。在未来需要的时候,再回来看看,再继续去研究它。新的特性固然有趣,但掌握它不容易,ECMAScript 这门语言会越来越难,这是一定的。这一门语言想要获得更多的功能以及健壮发展,不单单只是提供 API 而已,而是希望你能根据自己的实际需求来定义自己的 API。

下一节的 Reflect 也是如此,希望大家在脑海中有一个印象。在未来需要的时候,我也会不断地更新新的篇章以及高级的用法。这三篇内容更多的是将 ES6 以及之前版本的全部东西都拿出来讲一下,在你需要的时候就可以回来看看。而更多高级的东西我并没有介绍,原因就在于基础不牢固的人,讲了更多的东西也依然不能举一反三,任然只会套。另外,TypedArray、ArrayBuffer、DataView 这些 ES6 中的新东西我也不打算讲,效益太低了。大家看了并用不上的东西,可以暂时放一放。


总结

本节没什么好总结的啦。希望大家看下这一章有个印象,知道他是什么就好了。未来需要的时候我会继续更新。

你可能感兴趣的:(元程序设计之 Proxy(代理))