For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/year/pending/proposal-refcollection.md.
  • 简体中文
  • RefCollection ?

    提案概览
    提案速览

    RefCollection 提供了一种通过符号(symbols)保存对对象的稳定引用的方式,从而无需修改对象即可遍历引用。它旨在与 Records 和 Tuples 协作,允许在不可变结构中引用函数和其他值。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    RefCollection

    ECMAScript 提案:RefCollection。

    作者:

    • Robin Ricard(彭博)

    推动者:

    • Robin Ricard(彭博)
    • Richard Button(彭博)

    顾问:

    • Dan Ehrenberg(Igalia)

    阶段: 0

    概述

    RefCollection 引入了一种通过符号(symbols)来保存对对象的引用(value references)的方式。

    其主要目标之一是能够在 Records and Tuples 中跟踪对象,而不会在其中引入任何可变内容。

    RefCollection 能够自动跟踪符号,使得当符号变得不可达时(并且由于符号无法伪造),被引用的对象也可以变得不可达。

    示例

    const refc = new RefCollection();
    
    const rootRef = refc.ref(document.getElementById("root"));
    assert(refc.deref(rootRef) === document.querySelector("#root"));
    
    const otherRootRef = refc.ref(document.querySelector("#root"));
    assert(rootRef === otherRootRef);

    Records and Tuples 结合使用

    const refc = new RefCollection();
    
    const vdom = #{
        type: "div",
        props: #{ id: "root" },
        children: #[
            #{
                type: "button",
                props: #{
                    onClick: refc.ref(function () {
                        alert("Clicked!");
                    }),
                },
                children: #[
                    "Click Me!",
                ],
            },
        ],
    };
    
    refc.deref(vdom.children[0].props.onClick).call();
    // 提示:已点击!

    API

    new RefCollection()

    创建一个 RefCollection。不接受任何初始化参数。

    RefCollection.prototype.ref(obj, sym = Symbol())

    为对应的对象 obj 返回一个稳定的 symbol

    你可以可选地提供一个符号 sym,如果需要一个新符号,它将使用该符号。如果 obj 已经存在于 RefCollection 中,sym 将被丢弃。如果 sym 已经指向了 RefCollection 中的某个对象,则预期会抛出 TypeError

    RefCollection.prototype.deref(sym)

    返回与符号 sym 对应的对象。如果传入的 symbol 不是由同一个 RefCollection 返回的,你将收到 undefined

    行为

    对象-引用稳定性

    该集合不允许你更改或删除其中的内容,只允许添加。因此,对于同一个对象,预期获得相同的引用符号。

    不可达性

    当集合变得不可达时,RefCollection 会将所有被跟踪的对象标记为不可达。

    如果某个符号独立地变得不可达,由于符号无法被重新伪造,集合会将相应的对象标记为从集合中不可达。

    注意:第二点无法通过 polyfill 实现。

    Polyfill

    你可以在 同一仓库中找到 polyfill

    常见问题

    为什么使用符号?

    符号是表示引用的好方法,因为我们无法重新伪造它们来从无到有地重新创建引用(而数字或字符串是可以被伪造的)。