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