跳到主要内容

3 篇博文 含有标签「理解ECMAScript」

查看所有标签

理解ECMAScript规范,第三部分

· 阅读需 12 分钟
[Marja Hölttä](https://twitter.com/marjakh),推测性规范观察者

所有系列文章

在本篇中,我们将深入了解ECMAScript语言及其语法的定义。如果您对上下文无关语法不熟悉,现在是学习基础知识的好时机,因为规范使用上下文无关语法来定义语言。请参阅《Crafting Interpreters》中的上下文无关语法章节以获得更易理解的介绍,或者查看维基百科页面以获取更数学化的定义。

理解 ECMAScript 规范,第2部分

· 阅读需 11 分钟
[Marja Hölttä](https://twitter.com/marjakh),推测性规范观察者

让我们继续练习我们出色的规范阅读技巧。如果你还没有查看前一集,现在是个好机会!

所有章节

准备好进入第2部分了吗?

一个有趣的了解规范的方式是,从一个我们知道有的JavaScript功能开始,找出它是如何被规范定义的。

警告!本集包含从ECMAScript规范(截至2020年2月)中复制粘贴的算法。它们最终会过时。

我们知道属性是在原型链中查找的:如果一个对象没有我们尝试读取的属性,我们就沿着原型链向上查找,直到找到它(或者找到一个没有原型的对象)。

例如:

const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99

原型链查找在哪里定义?

让我们来找出这种行为是在哪里定义的。一个好的起点是查看对象内部方法的列表。

既有[[GetOwnProperty]],也有[[Get]]——我们感兴趣的是不限于自身属性的版本,所以我们选择[[Get]]

不幸的是,属性描述符规格类型也有一个名为[[Get]]的字段,因此在查看规范时,我们需要仔细区分这两种独立的用法。