Javascript 的未来离不开元编程(1)

这是我参与更文挑战的第 4 天,活动详情查看: 更文挑战

什么是元编程

先从 Meta 说起,很多地方出现过这个词,我第一次是 html 标签看到 meta 这个词,我们先从其本意说起。其实 Meta 愿意是 post 意思,其实本意有点高级和二次元的意思。但西方哲学界在几千年中渐渐赋予该词缀一种全新的意义,关于某事自身的某事。比如 meta-knowledge 就是关于知识本身的知识,meta-data 就是关于数据的数据,meta-language 就是关于语言的语言,而 meta-programming 也是由此而来,是关于编程的编程。

元编程定义

批量生成各种代码(类,方法,测试等等),减少编程时的重复操作,而且是在运行时,而不是编译时。而且元编程是将程序理解为数据,读取这些数据来在运行时生产代码。

顺便说说 Lisp,大家都知道“代码及数据”这回事,其实就是这样子一回事。那么简单地理解元编程的定义就是写出编写代码的代码,lisp 语言中可以使用 quote 可以阻止求值,到需要使用的时候用eval 就行了。

深入了解过 excel 的朋友,一定对宏并不陌生,经常会报宏错误。可以执行宏命令来实现一系列的经常被用到操作。在编程中也是,我们在 c++ 和 rust 都使用到宏来预定义一些结构或代码段。

在 javascript 中,我们也可使用 eval 来执行带代码字符串,但是不推荐大家去用用这种方式来实现元编程。

从 ES6 开始,JavaScrip添加了对Proxy和Reflect对象的支持,允许我们连接并定义基本语言操作的自定义行为(如属性查找,赋值,枚举和函数调用等),从而实现JavaScrip的元级别编程。

接下来我们就通过两个例子来介绍 Proxy 和 Reflect 是如何改变代码行为。

Proxy

const obj = {text:"hello",count:0}

const customObj = new Proxy(obj,{
    get:(obj,property)=>{
        console.log(obj[property]);
        return obj[property];
    }
});

const textVal = customObj.text
const countVal = customObj.count
复制代码
hello
0
复制代码

代码代码应该很好理解,通过代理将 obj 的 get 行为进行更改,当调用 customObj 属性获取属性值时会触发一些侧边效应。

Reflect

Reflect.get(obj,"text");
Reflect.set(obj,"hello",true);
Reflect.deleteProperty(obj,"count")
console.log(obj)
复制代码
{ text: 'hello', hello: true }
复制代码

先简单了解,一下随后我们就其进行展开,以及通过一些直接场景让我们更加了解元编程的用处。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享