【译】JavaScript中的 "Internal Slots" 和 "Internal Methods" 到底是什么?

您所在的位置:网站首页 内部javascript 【译】JavaScript中的 "Internal Slots" 和 "Internal Methods" 到底是什么?

【译】JavaScript中的 "Internal Slots" 和 "Internal Methods" 到底是什么?

2023-10-16 21:48| 来源: 网络整理| 查看: 265

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

在ECMA-262标准的 6.1.7.2 章节中讨论了一些Object中的奇怪的内部属性和内部方法。这些属性和方法被JavaScript引擎所实现,但是他们从运行时中被抽象出来,也就是说你不能够像普通的属性和方法一样去访问它们。

这些内部属性和方法在ECMAScript标准中通常以 [[name]] 这样的形式来表示,name表示内部属性和内部方法的名字。内部属性称为内插槽,它包含与该对象关联的值以表示对象的某些状态。

让我们快速的看一个例子。 [[GetPrototypeOf]] 内部方法被所有的对象所实现并且返回该对象的 prototype。当执行 Reflect.getPrototype(obj)方法时,JavaScript引擎会调用 [[GetPrototypeOf]] 内部方法,并且返回 [[Prototype]] 内插槽的值,该内插槽就包含了其对象的 prototype。

obj.__proto__ 也指向了对象的 prototype,它与上述的方法类似。

当一个对象的内部方法被调用,就像上面提到的例子一样。该对象被称为调用的“target”。如果target不支持内部方法,例如我们调用 Reflect.getPrototypeOf(null) ,TypeError 就会被抛出。

对象可以用多个内插槽和内部方法。ECMAScript标准没有描述哪些内部犯法应该被实现但是其描述了调用方法的签名。下面表格中的内部方法被所有的对象所实现。

image.png

内插槽和内部方式是为ECMAScript规范提供帮助的,它们在规范中被引用以传递适当的行为。例如:当[[Prototype]] 关键词出现时,我们就知道该标准在讨论包含对象原型的内部属性。

内部插槽和内部方法有助于实现对象的一致行为和实现者(JavaScript引擎)可以通过查看规范来正确提供这些实现。但是,其不必遵循规范指定的函数签名。这个ecmascript 6 - Are internal slot and internal methods actually implemented by JavaScript engines? - Stack Overflow)答案将给你一些启发。

ES6的标准提供了 Reflect 对象来提供检查和修改对象的能力。例如: Reflect.has(target, key) 方法检查 target 对象是否拥有 key 属性在其中或者在其原型对象中。它与 in 操作符类似,但是这是一种函数的形式。

当target调用此方法(has)时,JavaScript引擎执行由JavaScript引擎实现的[[hasproperty]]内部方法。不同的JavaScript引擎可以不同地实现此方法,但它应该遵循ECMA-262规范。

ES6同样提供了 Proxy 构造函数,它可以被用来创建一个对象的代理对象。例如: let proxy = new Proxy(target, handler) 这里的 proxy对象通过hanlder提供 target 对象上的接口。 handler 对象包含了一系列的方法,这些方法可以拦截原对象上的方法。

因此,这些handler称为“陷阱(traps)”,因为它们拦截目标上的操作。这些处理程序方法类似于具有相同名称的 Reflect 方法。例如,当在代理上调用in运算符时执行handler.has。

如果handler对象没有特定方法,例如在这种情况下,则JavaScript引擎自动执行与[[haPproperty]]的目标上的(其类似于Reflect.has)相关联的内部方法方法。

我知道要理解内插槽和内部方法的概念是非常困难的。但不用担心,我写有关于 Reflect 和 Proxy 的文章,它们会帮助你厘清这一切。

最后,JavaScript运行时没有暴露于这些内部插槽,并且内部方法仅限于ECMAScript规范文档。

为了进一步详细说明,V8团队已经编写了一个简明的文章,了解如何阅读ECMAScript规范,该规范还包含有关内部插槽和内部方法的一些信息。我认为对于JavaScript开发人员来说它是非常值得阅读的。并且它是一个简短的文档Understanding the ECMAScript spec, part 1 · V8,在此强烈推荐。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3