紧接上回,伴随着Reflect,Proxy降世,为js带来了更便捷的元编程!

什么是元编程?这词第一次听,有点懵,好像有点高级,这不得学一下装…进自己的知识库

概念

元编程是一种编程技术,编写出来的计算机程序能够将其他程序作为数据来处理。意味着可以编写出能够读取、分析或者转换其他程序的能力,甚至是在运行时修改程序自身

往简单意思大概是说:这是一种编程技术,我写的代码能改变其他代码,甚至运行时自己改变自己,哇,这一听怎么有点像人工智能;

看个例子,有个这样的面试题,这个a是什么时,才能输出里面的内容?

// let a = ??? 可使 a 成功输出
if (a == 1 && a == 2 && a == 3) {console.log("元编程");
}

那只有a会变化,才有可能输出里面的内容了;比如a初始值是1,调用一次+1,那就可以满足了,要让代码自我修改,即代码修改自身属性或其他底层属性,这不就是刚刚提的元编程中有的么?于刚学了proxy所以使用代理的解法,在a==1的时候会调用a.get,所以可以在get的时候拦截,做一些自定义操作,修改对象的属性值并返回对比所需要的操作

let a = new Proxy({ value: 1 }, {get(target, property, receiver) {// 隐式转换会调用Symbol.toPrimitive,这是一个函数if (property === Symbol.toPrimitive) {// 要返回一個函数用于在对比中转换return () => target.value++}}
})

Symbol.toPrimitive是内置的 symbol 属性(用作函数值),被调用的指定函数值的属性转换为相对应的原始值,它被所有的强类型转换制算法优先调用

注:a==1注意是两个等号,所以a在对比的时候就会触发valueOf()方法,若此方法返回还是对象,就继续调用toString()方法。所以也可以通过重写valueOf() 或者 toString() 方法都可行

let a = {i: 1,valueOf() {return this.i++}
}

再看一下ProxyReflect对象

自ES6开始,JavaScript获得了ProxyReflect对象的支持,允许你拦截某些操作并实现自定义行为;这样我们不就可以使用这两个对象,更简单的编写出拥有能够读取、分析或者转换其他程序能力,甚至是在运行时修改程序自身的代码;

看完上面的例子我们对元编程应该有了一个模糊的认识,接下来,来看一下,元编程和普通编程的不同,元编程主要的几点特性,看看这种编程技术在关注什么?解决什么?有什么优缺点?

元编程和普通编程的不同

普通编程:一般代码的操作对象是数据,输入数据输出数据,程序运行是动态的,但程序本身是静态的

元编程:操作对象是代码,将程序作为数据来对待,程序运行是动态的,但程序本身也是动态的

  • 元语言非目标语言–侧重代码内容的生成,并不关注目标语言代码的编译和执行,也可以称之为产生式生成或代码生成技术
  • 元语言即目标语言–主要靠反射机制,允许程序在运行时改变自身的行为

元编程的意义?

元编程旨在用更灵活的代码来适应快速变化的需求,同时保证性能;扩展语言的普通机制来提供额外的能力

元编程的优缺点?

  • 优点提升程序性能提成程序的理解能力提升程序的复用能力* 缺点如果编程的本质是抽象,那么元编程就是更高层次的抽象,那元编程这样代码的可读性,可维护性就大大降低了,有些代码甚至会像看天书一样。让代码去生成代码,去修改自己,如果使用不当,在安全性上,存在很大的隐患### JavaScript中的元编程

  • 修改默认的语言行为:Object.defineProperty()Proxy* 反射:Reflect* 生成代码:`eval````let str = “function sayHello(){console.log(‘hello’)}”;eval(str);sayHello();// 输出hello ```### 总结

  • 还是先理解记住一下相关概念,元编程是一种编程技术,编写出来的计算机程序能够将其他程序作为数据来处理。意味着可以编写出能够读取、分析或者转换其他程序的能力,甚至是在运行时修改程序自身。

  • ES6新增了对 ReflectProxy 对象的支持,使得我们能够便捷地进行元编程

  • 如果对ReflectProxy 对象还不是很了解,看看前面的那片文章

  • 如果你看到这里了,烦请大佬点个赞,鼓励小弟学习,不胜感激,谢谢

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

JavaScript中的元编程相关推荐

  1. Python中的元编程:一个关于修饰器和元类的简单教程

    作者 | Saurabh Kukade 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程.我想在本文中分享我对 ...

  2. Python中的元编程(Meta-Programming)

    元编程:是编写出可以操作的代码的行为,即用代码来操作另一个代码. Python中的元编程:一种构建函数和类的行为,这些函数和类可以通过修改.包装现有代码或生成代码来进行操纵. Python中元学习的实 ...

  3. python元编程运用_Python 中的元编程

    就像元数据是有关数据的数据一样,元编程就是编写用于操纵程序的某些程序.人们普遍认为,元程序就是生成其他程序的某些程序,但范式更加广泛.所有旨在自我读取.分析.转换或修改的程序都是元编程的范例.例如: ...

  4. JavaScript 中的函数式编程实践

    为什么80%的码农都做不了架构师?>>>    基础知识 函数式编程简介 说到函数式编程,人们的第一印象往往是其学院派,晦涩难懂,大概只有那些蓬头散发,不修边幅,甚至有些神经质的大学 ...

  5. javascript函数式_如何以及为什么在现代JavaScript中使用函数式编程

    javascript函数式 by PALAKOLLU SRI MANIKANTA 通过PALAKOLLU SRI MANIKANTA In this article, you will get a d ...

  6. wpf绑定 dictionary 给定关键字不再字典中_为什么要在 JavaScript 中学习函数式编程?...

    请忘掉你认为你知道的有关 JavaScript 的任何东西,以初学者心态来接触这份资料. 为帮助你这样做,我们打算从头开始复习 JavaScript 的基础知识, 就好像你以前从来没有看到过 Java ...

  7. 聊聊Kotlin中的元编程

    背景 首先还是来说下为什么出现元编程? 一个技术的出现肯定是不满足现状,那么元编程的出现是为了解决什么问题呢?举一个栗子,比如我们需要获取某个类的属性进行赋值取值或者获取函数信息进行调用时,我们当然可 ...

  8. JavaScript 中的函数式编程:函数,组合和柯里化

    作者:Fernando Doglio 译者:前端小智 来源:medium 移动端阅读:点这里 点赞再看,微信搜索 [大迁世界] 关注这个没有大厂背景,但有着一股向上积极心态人.本文 GitHub ht ...

  9. js读取html元素scr,了解一下JavaScript中的DOM编程

    如何在HTML中使用JavaScript 元素 元素用于在HTML页面中嵌入或引入JavaScript脚本代码.该元素默认被定义在 元素中 1.type:该属性定义script元素包含或src引入的脚 ...

最新文章

  1. matlab用辛普森公式求积分_如何用Excel公式求最大值对应的行列序号
  2. 10-礼帽与黑帽操作
  3. fft 相位谱_基于级联FFT的广义互相关算法在声源定位中的应用
  4. dijkstra最短路径算法视频_Dijkstra最短路径算法
  5. 【OpenCV】腐蚀膨胀
  6. ECMAScript 6 开篇准备
  7. MySQL使用SQL语句修改字段长度、字段名称
  8. SVN下载项目到本地
  9. Linux常用软件包
  10. changeable和changeful_change的形容词是什么?
  11. 如何打开windows的服务管理
  12. 计算机老师教师节祝福语,2020教师节祝福语精选
  13. 联想SR158 安装CentOS7系统
  14. 用fun函数实现s=(ln(1)+ln(2)+...+ln(m))^1/2,函数返回s
  15. magento EAV 模型理解
  16. Sketch网页截屏插件设计开发
  17. Oracle账号频繁被锁定
  18. 操作系统(第三章)——思维导图总结
  19. 二次元论坛php,Discuz动漫二次元风格网站模板商业版
  20. 常见编码和编码头BOM

热门文章

  1. 最强最简单的方法:本地安装,阅读官方go博客《Go Blog》
  2. Swiper 轮播图分页器 swiper-pagination无法显示轮播失效 问题
  3. DevC++的调试方法
  4. 用简单技术对老旧照片进行翻新上色
  5. 华为Mate 30高光还是暗淡,留给华为的时间不多了
  6. Linux系统中如何彻底隐藏一个TCP连接?
  7. 你的小程序总是审核不通过?
  8. SQL中Table型数据(表变量)与用户自定义函数(downmoon)
  9. Ubuntu手把手教你安装
  10. javascript ←AES.CBC→ go 相互加密解密