gettersetter

这两个属性可以与 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)]
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) 访问。请注意,两个函数都有一个 this 参数,因为它们都使用 method 标记。

最后,你还可以将参数传递给 gettersetter 属性,以配置访问哪个属性。当显式指定属性时,对方法名称没有限制。例如,下面与上面是等效的

#![allow(unused)]
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);
}
}

注意!gettersetter 函数在加载时在构造函数的原型链上找到一次,缓存,然后在每次访问时调用缓存的访问器。如果需要在每次访问时动态遍历原型链,请添加 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;
};