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