indexing_getterindexing_setterindexing_deleter

这三个属性表明,一个方法是接收器对象本身上的动态拦截 getter、setter 或 deleter,而不是直接访问接收器的属性。它等效于使用 JavaScript 中某个动态 `prop` 变量调用 `obj[prop]` 操作的 Proxy 处理程序,而不是在普通的 JavaScript `Object` 上像 `obj.prop` 这样的普通静态属性访问。

这对于绑定到 `Proxy` 和一些动态拦截属性访问的内置 DOM 类型非常有用。

  • `indexing_getter` 对应于 JavaScript 中的 `obj[prop]` 操作。 注释的函数必须具有一个 `this` 接收器参数、一个用于索引到接收器 ( `prop` ) 的单个参数和一个返回类型。

  • `indexing_setter` 对应于 JavaScript 中的 `obj[prop] = val` 操作。 注释的函数必须具有一个 `this` 接收器参数、一个用于索引到接收器 ( `prop` ) 的参数和一个值参数 ( `val` )。

  • `indexing_deleter` 对应于 JavaScript 中的 `delete obj[prop]` 操作。 注释的函数必须具有一个 `this` 接收器和一个用于索引到接收器 ( `prop` ) 的单个参数。

这些必须始终与 `structural` 和 `method` 标志结合使用。

例如,考虑以下使用 `Proxy` 的 JavaScript 代码片段

const foo = new Proxy({}, {
    get(obj, prop) {
        return prop in obj ? obj[prop] : prop.length;
    },
    set(obj, prop, value) {
        obj[prop] = value;
    },
    deleteProperty(obj, prop) {
        delete obj[prop];
    },
});

foo.ten;
// 3

foo.ten = 10;
foo.ten;
// 10

delete foo.ten;
foo.ten;
// 3

要在 Rust 的 `wasm-bindgen` 中绑定该代码,我们将在方法上使用 `indexing_*` 属性


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    type Foo;
    #[wasm_bindgen(thread_local_v2)]
    static FOO: Foo;

    #[wasm_bindgen(method, structural, indexing_getter)]
    fn get(this: &Foo, prop: &str) -> u32;

    #[wasm_bindgen(method, structural, indexing_setter)]
    fn set(this: &Foo, prop: &str, val: u32);

    #[wasm_bindgen(method, structural, indexing_deleter)]
    fn delete(this: &Foo, prop: &str);
}

FOO.with(|foo| {
    assert_eq!(foo.get("ten"), 3);

    foo.set("ten", 10);
    assert_eq!(foo.get("ten"), 10);

    foo.delete("ten");
    assert_eq!(foo.get("ten"), 3);
});
#}