元编程是什么意思?都有哪些元编程?
Admin 2022-03-09 群英技术资讯 3179 次浏览
今天给大家简单的介绍一下元编程,那么元编程是什么呢?都有哪些元编程?接下来我们就一起来了解看看,本文示例对大家学习元编程有一定的帮助,大家可以参考。
何为元编程?
「编写能改变语言语法特性或者运行时特性的程序」。换言之,一种语言本来做不到的事情,通过你编程来修改它,使得它可以做到了,这就是元编程。
meta-programming元编程中的 元 的概念可以理解为 程序 本身。”元编程能让你拥有可以扩展程序自身能力
举个例子:
if (a == 1 && a == 2 && a == 3) {
console.log("done");
}
怎样才能让这个条件满足,输出done。按照正常的逻辑是无法完成的,毕竟一个值不可能同时满足等于1、2、3
这是就可以用到元编程来改变这个不可能
let a = {
[Symbol.toPrimitive]: ((i) => () => ++i)(0)
}
if (a == 1 && a == 2 && a == 3) {
console.log("done");
}
// done
Symbol.toPrimitive在对象转换为原始值的时候会被调用,初始值为1,调用一次+1,就可以满足a == 1 && a == 2 && a == 3,同时Symbol.toPrimitive也可以接受一个参数hint,hint的取值为number、string、default
let obj = {
[Symbol.toPrimitive](hint) {
switch (hint) {
case "number":
return 123;
case "string":
return "str";
case "default":
return "default";
}
}
}
console.log(1-obj); // -122
console.log(1+obj); // 1default
console.log(`${obj}`); // str
还有哪些元编程?
proxy
es5的Object.defineProperty()方法的es6升级版,用于自定义的对象的行为
let leon = {
age: 30
}
const validator = {
get: function(target, key){
// 若没这个属性返回37
return key in target ? target[key] : 37;
},
set(target,key,value){
if(typeof value!="number" || Number.isNaN(value)){
throw new Error("年龄得是数字");
}
}
}
const proxy = new Proxy(leon,validator);
console.log(proxy.name);
// 37
proxy.age = "hi";
// Error: 年龄得是数字
reflect-metadata
你可以通过装饰器来给类添加一些自定义的信息。然后通过反射将这些信息提取出来。当然你也可以通过反射来添加这些信息
require("reflect-metadata")
class C {
// @Reflect.metadata(metadataKey, metadataValue)
method() {
}
}
Reflect.defineMetadata("name", "jix", C.prototype, "method");
let metadataValue = Reflect.getMetadata("name", C.prototype, "method");
console.log(metadataValue);
// jix
应用
拓展数组索引访问
负索引访问,使array[-N] 与 array[array.length - N] 相同
let array = [1, 2, 3];
array = new Proxy(array, {
get(target, prop, receiver) {
if (prop < 0) { console.log(prop, 'prop') prop = +prop + target.length; } return Reflect.get(target, prop, receiver); } }); console.log(array[-1]); // 3 console.log(array[-2]); // 2
数据劫持
let handlers = Symbol('handlers');
function makeObservable(target) {
// 初始化存储 handler 的数组
target[handlers] = [];
// 存储 handler 函数到数组中以便于未来调用
target.observe = function(handler) {
this[handlers].push(handler);
};
// 创建代理以处理更改
return new Proxy(target, {
set(target, property, value, receiver) {
// 转发写入操作到目标对象
let success = Reflect.set(...arguments);
// 如果设置属性的时候没有报错
if (success) {
// 调用所有 handler
target[handlers].forEach(handler => handler(property, value));
}
return success;
}
});
}
let user = {};
user = makeObservable(user);
user.observe((key, value) => {
console.log(`SET ${key}=${value}`);
});
user.name = "John";
// SET name=John
以上就是关于元编程的介绍啦,希望本文对大家学习和理解元编程有帮助,想要了解更多元编程的内容,可以继续浏览群英网络其他相关的文章。
文本转载自脚本之家
相关推荐:
元数据是什么?一文带你快速了解元数据
PHP脚本性能怎样提高?教你几个实用方法
PHP代码加密方法有哪些,你知道几个?
python内存分配机制实例分析,一文带你看懂python内存分配
python元类是什么意思?怎样创建python元类?
Python中元类是什么意思?怎么创建元类?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文实例为大家分享了js实现按钮进行某行上移下移的具体代码,供大家参考,具体内容如下先上个通用简单的代码:<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-eq
目录一、什么是 TypeScript二、TypeScript 简史三、为什么我们要使用TypeScript?TypeScript的附加功能四、大牛现身说法:五、你可能不知道的TypeScript顶级功能1、面向对象程序设计2、接口、泛型、继承和方法访问修饰符3、编译时/静态类型检查4、比JavaScript代码更少5、
本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于声明提升的相关内容,声明提升是JavaScript解析器的一个特性,会对代码中的函数、变量声明语句作用提取到它所在的作用域的最前面,下面一起来看一下,希望对大家有帮助。
今天给大家分享的是React Hooks使用要注意问题的内容,本文有实例和详细注释供大家参考,对大家理解Hooks的使用有一定的帮助,接下来跟随小编一起看看吧。
今天给大家分享的是React合成事件的内容,react合成事件指的是react用js模拟了一个Dom事件流,对eact合成事件有了简单的了解之后,接下来我们就来深入了解看看eact合成事件,下文有很详细的介绍几示例,感兴趣的朋友可以参考。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008