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