indexing_getterindexing_setterindexing_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)的单个参数。

这些必须始终与 structuralmethod 标志一起使用。

例如,考虑这个使用 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)]
fn main() {
#[wasm_bindgen]
extern "C" {
    type Foo;
    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);
}

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);
}