趣学前端 | 元编程,翻书学习时发现的陌生词汇,当然是记个笔记

背景

最近睡前习惯翻会书,最近在重温《JavaScript权威指南》这本书。这本书,文字小,内容多。两年了,我才翻到第十章。因为书太厚,平时都充当电脑支架。

今天看文章目录的时候,发现一个章节叫「元编程」。我看书中的解释

常规编程是写代码去操作数据,元编程则是写代码去操作其他代码。

我是这样理解的,用代码去操作代码就意味着被操作的代码有可以被扩展的特性,比如可写、可枚举等。而这些特性,可以帮助实现一些特别的功能。利用特性去编写功能的过程可以被归结为「元编程」。比如编写可重用的库等。

元编程特性

属性的三个特性

可写、可枚举、可配置,这三个特性前两个我晓得,但是最后一个我没啥印象了。来看书里对三个特性的解释

  • 可写(writable)特性指定是否可以修改属性的值。
  • 可枚举(enumerable)特性指定是否可以通过for/in循环和Object.keys()方法枚举属性。
  • 可配置(configurable)特性指定是否可以删除属性,以及是否可以修改属性的特性。

可以使用Object的getOwnPropertyDescriptor方法,帮助获取对象上某个属性的属性描述符。如果不存在则会返回undefined。

let obj = {
  name: '张三',
  age: 17,
};
// name属性存在
console.log(Object.getOwnPropertyDescriptor(obj, 'name')); // => { value: '张三', writable: true, enumerable: true, configurable: true }
// interest属性不存在
console.log(Object.getOwnPropertyDescriptor(obj, 'interest')); // => undefined

示例代码中不存在interest属性,但是也不是不可以有。Object.defineProperty()方法可以帮助对象创建一个指定了特性的属性。

Object.defineProperty(obj, 'interest', {
  value: '华夏美食、国漫、古风重度爱好者',
  writable: true,
  enumerable: true,
  configurable: true,
});
console.log(obj.interest); // => 华夏美食、国漫、古风重度爱好者

Proxy

使用Proxy可以修改JavaScript对象的基础行为,并创建具体普通对象无法企及能力的代理对象。

代理对象可以从目标对象和处理器对象上获取它们的行为,进行特定处理;也可以只拦截对象操作,但仍然把操作委托给目标对象。

前一种方式可以帮助创建一个只读器,所有试图写入的操作都会抛出异常。

function readonlyProxy(p) {
  function readonly() {
    throw new TypeError('该方法是只读方法');
  }
  return new Proxy(p, {
    set: readonly,
    defineProperty: readonly,
    deleteProperty: readonly,
    setPrototypeOf: readonly,
  });
}

let obj = {
  name: '张三',
  age: 17,
};
let w = readonlyProxy(obj);
// 可以正常读取属性
console.log(w.name); // => 张三
// 删除报错
delete w.age; // => TypeError: 该方法是只读方法
// 写入报错
w.interest = '华夏美食、国漫、古风重度爱好者'; // => TypeError: 该方法是只读方法

后一种方式可以用于打印日志。这个功能占了满满三页,太长了,容我再学习一下。

模版标签

书上说

位于反引号之间的字符串被称为“模版字面量”。可以把定义使用标签化模版字面的标签函数看成是元编程。

比如String.raw``,可以返回反引号中未经处理的文本。

let len = String.raw`\n`.length;
console.log(len); // => 2:一个反斜杠字符和一个字母n

打印结果:

虽然不知道实际使用场景,但是多学一点总有好处,保不齐将来可能会用到。

总结

温故果然可以知新,我们来总结一下本篇的收获。

学习完元编程的章节,已经没有最初看到它的时候那么困惑了,感觉有些难读懂的源代码有望读懂了。而且打印日志的功能,我准备再研究研究,我有预感,肯定能有大用。

《JavaScript权威指南》真是一本宝藏图书,看来有必要把其他章节都学习一下。

今天也特别有收获的一天。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶一一yyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值