getter
和 setter
这两个属性可以与 method
结合使用,以表明这是一个 getter 或 setter 方法。默认情况下,带有 getter
标签的函数会访问与 getter 函数同名的 JavaScript 属性。setter
函数的名称目前必须以 set_
开头,并且它访问的属性是 set\_
之后的后缀。
考虑以下 JavaScript 类,它具有 white_russians
属性的 getter 和 setter。
class TheDude {
get white_russians() {
...
}
set white_russians(val) {
...
}
}
我们将使用以下 #[wasm_bindgen]
属性导入它
# #![allow(unused_variables)] #fn main() { #[wasm_bindgen] extern "C" { type TheDude; #[wasm_bindgen(method, getter)] fn white_russians(this: &TheDude) -> u32; #[wasm_bindgen(method, setter)] fn set_white_russians(this: &TheDude, val: u32); } #}
在这里,我们导入了 TheDude
类型,并定义了访问每个对象的 white_russians
属性的能力。这里的第一个函数是一个 getter,在 Rust 中可作为 the_dude.white_russians()
访问,而后者是 setter,可作为 the_dude.set_white_russians(2)
访问。请注意,由于它们带有 method
标签,因此两个函数都具有 this
参数。
最后,您还可以将参数传递给 getter
和 setter
属性,以配置访问哪个属性。当显式指定属性时,对方法名称没有限制。例如,以下内容与上述内容等效
# #![allow(unused_variables)] #fn main() { #[wasm_bindgen] extern "C" { type TheDude; #[wasm_bindgen(method, getter = white_russians)] fn my_custom_getter_name(this: &TheDude) -> u32; #[wasm_bindgen(method, setter = white_russians)] fn my_custom_setter_name(this: &TheDude, val: u32); } #}
注意! getter
和 setter
函数在加载时会在构造函数的原型链上找到一次,缓存,然后在每次访问时调用缓存的访问器。如果需要在每次访问时动态遍历原型链,请添加 structural
属性!
// This is the default function Rust will invoke on `the_dude.white_russians()`:
const white_russians = Object.getOwnPropertyDescriptor(
TheDude.prototype,
"white_russians"
).get;
// This is what you get by adding `structural`:
const white_russians = function(the_dude) {
return the_dude.white_russians;
};