indexing_getter
、indexing_setter
和 indexing_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)] 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); }); }