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)。

這些必須始終與 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;
    #[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);
});
}