JavaScript中的元编程

news2025/1/13 2:49:26

紧接上回,伴随着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的提问。



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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法】Collection接口迭代器

Java合集框架 数据结构是以某种形式将数据组织在一起的合集(collection)。数据结构不仅存储数据,还支持访问和处理数据的操作 在面向对象的思想里,一种数据结构也被认为是一个容器(container)或者容器对象…

【MySQL】MySQL表的七大约束

序号系列文章1【MySQL】MySQL介绍及安装2【MySQL】MySQL基本操作详解3【MySQL】MySQL基本数据类型4【MySQL】MySQL表的七大约束文章目录MySQL表的约束1,默认约束2,非空约束3,唯一约束4,主键约束5,自增约束6&#xff0c…

详细分析单调栈,及正确性证明

什么是单调栈 对于一个数组,需要对每个位置生成,左右两边离它最近的,比它小(或比它大)的位置在哪 例如: 如果对每个位置都遍历下左右两边,找到第一个比它小的位置,就是O(N ^ 2)的…

IPv6 时代如何防御 DDoS 攻击?

在互联网世界,每台联网的设备都被分配了一个用于标识和位置定义的 IP 地址。20 世纪 90 年代以来互联网的快速发展,联网设备所需的地址远远多于可用 IPv4 地址的数量,导致了 IPv4 地址耗尽。因此,协议 IPv6 的开发和部署已经刻不容…

从第三方平台导出大数据量本地Excel怎么解决性能问题?

对于日常需要做分析的我们来说,周期性需要从第三方系统导出数据,日积月累数据量越来愈大,由开始的几百条数据慢慢增至十几万甚至百万级的数据量,在本地Excel直接做分析汇总老是卡顿等半天,效率日益低下,每天…

连续四年发布科技趋势预测,他们在探索中国科技的“主干道”

,*本文配图由百度飞桨文心一格提供AI绘画技术支持。古希腊流传着一句谚语:智慧不仅是能够明察眼前,更要能够预测未来。身处科技界,一到年底年初我们就会看到各种各样的趋势预测。这些预测五花八门,神奇多变。但大多数科…

JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来3 —— 本地缓存变身分布式集群缓存,打破本地缓存天花板

大家好,又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。 上一篇文章中,我们知晓了如何在项目中通过不同的…

【Python】Numpy处理多项式类Polynomial

文章目录构造函数求导和积分求根和反演采样与拟合其他方法构造函数 Numpy中提供了多项式模块,里面封装了一些用以快速解决多项式问题的类和函数,其中最重要类的自然是Polynomial,其构造函数为 class numpy.polynomial.polynomial.Polynomia…

list容器的底层结构(详述insert()与erase())

目录 一、带头结点的双向循环链表(list) 二、贯穿list容器的insert与erase接口​编辑 一、带头结点的双向循环链表(list) 二、贯穿list容器的insert与erase接口 通过在指定位置的元素之前插入新元素来扩展容器。 这有效地增加了…

520页(17万字)集团大数据平台整体解决方案-v1.0

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 1.1.1 系统总体逻辑结构 4-14系…

Golang 面试题总结

一.基础部分 go语言的值类型和引用类型? 值类型:int、float、bool、string和数组这些类型都属于值类型。 值类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用 将一个变量的值赋给另一个变量时,如 j i ,实…

九、k8s 安全认证

文章目录1 访问控制概述2 认证管理3 授权管理4 准入控制1 访问控制概述 Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群中&#…

MySQL调优-深入理解MVCC机制

目录 MySQL调优-深入理解MVCC机制 MVCC多版本并发控制机制 undo日志版本链与read view机制详解 根据图2和图3对应画出下图的undo日志版本链: 版本链比对规则: 注意: 举例1:分析一下下图select1的read_view以及各个select语句…

Cadence PCB仿真使用Allegro PCB SI导入其他板卡的层叠结构的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,导入方法3,总结1,概述 本文详细介绍使用Allegro PCB SI PCB仿真软件导入其他电路板层叠结构的方法。 2,导入方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PC…

STL-vector的接口使用及模拟实现

文章目录vector类的介绍vector类的常用接口介绍 构造相关 无参构造迭代器区间构造拷贝构造 容量相关的接口 sizereserveresizecapacityempty 数据访问及遍历相关的接口 operator[]begin endrbegin rend 修改数据相关的接口 push_backpop_backinserterase vector类的模拟实现…

excel统计函数:应用广泛的动态统计之王OFFSET 下篇

【前言】在上篇文章中,我们了解了OFFSET函数的运算原理和各个参数的作用,并且我们也通过一些OFFSET的案例,了解了它的用途。那么本篇我们继续来看看,OFFSET函数在实际工作中所能起到的强大效果吧。一、高阶应用的思路(…

vector使用指南

目录 引言 空间配置器 vector 与 string的一些差异 vector容器与string容器的一些差异 接口介绍——reserve resize接口 shrink_to_fit 接口 operator[ ] 和 at 接口 assign接口 增删查改接口 swap接口 例题讲解 引言 vector实质上就是数据结构的顺序表&#xff0…

数据结构:栈和队列(详细讲解)

🎇🎇🎇作者: 小鱼不会骑车 🎆🎆🎆专栏: 《数据结构》 🎓🎓🎓个人简介: 一名专科大一在读的小比特,努力学习编程是我唯一…

(8)Qt中的自定义信号

目录 自定义信号需要遵循的规则 信号的发送 自定义信号的基本实现 使用一个父子窗口切换的小案例 Qt框架提供的信号在某些特定场景下是无法满足我们的项目需求的,因此我们还设计自己需要的的信号,同样还是使用connect()对自定义的信号槽进行连接。 自…

制造业ERP管理系统解决方案之销售管理

在企业的生存发展中,销售管理起到了重要的作用,它决定着企业发展的提速和效益的提升。做好销售管理工作,不仅可以推动企业资金有效运转,还可以使企业在稳定中高效发展,使企业价值最大化。而在制造企业销售管理中&#…